1

センサーにデータを送信したいのですが、Python スクリプトがデータを受信しない場合は、受信機能がタイムアウトしてデータを再送信する必要があります。

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()関数を再実行したい。

タイムアウトと試行/例外を指定して while true ステートメントを使用しようとしましたが、ポートを閉じても現在使用中のポートが取得されます。また、この方法は面倒です。

どんなアイデアでも大歓迎です。

4

1 に答える 1

1

最初にソケットを閉じずに、これらの関数のいずれかを呼び出すたびにソケットを再作成しているため、「現在使用中」の例外が発生します。

事前にソケットを作成してみてください。受信ソケットが作成される前に応答が来る可能性があります。この場合、パケットは単に拒否されます。

次に、ループ内のsendto-呼び出しのみを試行する必要があります。recvfrom

また、受信ソケットでsettimeoutを使用してタイムアウトを設定し、ブロックされないようにしてからタイムアウト例外をキャッチするか、 selectpollなどのポーリング メカニズムを使用して、データを受信したかどうかを確認する必要があります。

于 2016-07-25T18:59:43.197 に答える