2016-07-25 153 views
1

我想发送一些数据到传感器,如果python脚本没有收到数据我希望接收函数超时并重新发送数据。如果没有数据接收,Python UDP套接字重新发送数据

def subscribe(): 
    UDP_IP = "192.168.1.166" 
    UDP_PORT = 10000 
    MESSAGE = '6864001e636caccf2393730420202020202004739323cfac202020202020'.decode('hex') 
    print "UDP target IP:", UDP_IP 
    print "UDP target port:", UDP_PORT 
    print "message:", MESSAGE 
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) 
    recieve_data = recieve() 
    if recieve_data == subscribe_recieve_on or recieve_data == subscribe_recieve_off: 
     logging.info('Subscribition to light successful') 
    else: 
     logging.info('Subscribition to light unsuccessful') 

def recieve(): 
    UDP_IP = "192.168.1.118" 
    UDP_PORT = 10000 
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP  
    sock.bind((UDP_IP, UDP_PORT)) 
    data, addr = sock.recvfrom(1024) 
    return data.encode('hex') 

subscribe() 

在它被卡在接收功能,如果它没有接收到任何数据的时刻:但是我希望它如后超时

data, addr = sock.recvfrom(1024) 

2秒钟并重新运行subscribe()函数。

我试过使用一段时间的真正的语句与超时和尝试/例外,但是我得到一个当前正在使用的端口,即使关闭端口。也感觉这种方式很混乱。

任何想法,将不胜感激。

回答

0

您会看到“当前正在使用”的例外情况,因为您每次调用其中一个函数时都会重新创建套接字,而没有先关闭它们。

尝试事先创建套接字。响应可能在接收套接字被创建之前发生,在这种情况下数据包将被拒绝。

然后,您应该只尝试一个循环中的sendto - recvfrom调用。

而且您可能需要接收套接字上设置超时与settimeout所以它不会阻止,然后赶上超时异常或使用轮询机制喜欢selectpoll检查您是否已经收到任何数据。