2016-07-25 7 views
1

Ich möchte einige Daten an einen Sensor senden, und wenn das Python-Skript die Daten nicht empfängt, möchte ich die Empfangsfunktion Timeout und die Daten erneut senden.Python UDP-Socket senden Daten erneut, wenn keine Daten empfangen wurden

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() 

Im Moment ist es in der Funktion erhalten stecken bleibt, wenn es keine Daten erhalten:

data, addr = sock.recvfrom(1024) 

Jedoch habe ich es nach dem Beispiel Timeout wollen 2 Sekunden und führen Sie die Funktion subscribe() erneut aus.

Ich habe versucht, eine while true-Anweisung mit einem Timeout und versuchen/Ausnahme, aber ich bekomme einen Port derzeit in Betrieb, auch wenn Sie den Port schließen. Fühle mich auch so unordentlich.

Irgendwelche Ideen würden geschätzt.

Antwort

0

Sie erhalten die Ausnahme "momentan in Verwendung", weil Sie die Sockets jedes Mal neu erstellen, wenn Sie eine dieser Funktionen aufrufen, ohne sie vorher zu schließen.

Versuchen Sie, die Sockets vorher zu erstellen. Die Antwort könnte kommen, bevor der empfangende Socket erzeugt wird. In diesem Fall wird das Paket einfach abgelehnt.

Dann sollten Sie nur die sendto - recvfrom Anrufe in einer Schleife versuchen.

Auch müssen Sie entweder mit settimeout auf der Aufnahmebuchse ein Timeout setzen, damit es nicht dann die Timeout-Ausnahme abfangen blockiert bekommt oder einen Abfragemechanismus wie select oder poll verwenden um zu überprüfen, ob Sie alle Daten erhalten haben.

Verwandte Themen