2016-07-25 309 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檢查您是否已經收到任何數據。

相關問題