2017-02-28 1 views
0

私はモジュールプログラミングをしようとしています。論理は、ネットワークに中央デバイスと2つのサブデバイスが存在することです。サブデバイスは1分ごとにセントラルデバイスに信号を送信します。 1分以内にサブデバイスのいずれかから信号を受信して​​いる場合、そのデバイスのステータスはアクティブと表示されます。再び1分後、中央装置はその装置からの信号を再び検索しなければならない。 1分以内にその信号が得られない場合、その特定のデバイスのステータスはDeactiveでなければなりません。pythonでモジュールに1分ごとにシグナルが得られるかどうかをチェックする方法は?

私はこれをPythonで実装しようとしていました。しかし、異なるサブデバイスから1分ごとにシグナルアラートを個別にチェックする方法を知りません。

調査したところ、マルチスレッドとスリープタイマーという概念を使用しなければならないことが示されています。誰かが私にこのことがどうやってできるかというアイディアを教えてくれますか?

ありがとうございました!

答えて

0

は、デバイスがあなたのデバイス間の通信のためのソケットを使用することができることを意味ネットワーク、上にあるこの

import threading 
import thread 

def recieve_message(ip): 
    threading.Timer(60.0, recieve_message).start() 
    recieve_message_content 

if __name__ == "__main__": 
    # Create two threads as follows 
    try: 
     thread.start_new_thread(recieve_message, (127.0.0.1)) 
     thread.start_new_thread(recieve_message, (127.0.0.1)) 
    except: 
     print "Error: unable to start thread" 
+0

感謝を!。しかし、ここでは、サブデバイスがメッセージを送信していない場合、どのようにエラーを取得することができます! –

+0

この部分をrecieve_message_contentに配置します。サブデバイスがアクティブか非アクティブかをチェックします。彼は60秒後に再試行するよりも。あなたが関数を終了させたい場合は、returnを入れてください。 – user5056295

1

のようなものを試してみてください。ソケットをPythonで使用する方法の詳細については、hereを読んでください。ソケットを使用すると、サブデバイスから受信した信号を継続的に聴いて、毎分デバイスの状態を更新することができます。

0

同時に必要なのは、同時に接続されたクライアントのグループからのすべてのメッセージで動作するマルチクライアントサーバーです。 1つの簡単なコンセプトはモジュールSocketServerから得られます。サーバーに着信メッセージの処理方法を伝えるには、要求ハンドラのサブクラスを作成する必要があります。

サーバー

import SocketServer 

PORT = xxxxx # Any port you desire 

class RequestHandler(SocketServer.BaseRequestHandler) : 
def handle(self) : 
    address = self.client_address()[0] 

    time_0 = time.time() 
    while True : 
     try : 
      buff = self.request.recv(1024) 
      time_1 = time.time() 
      self.request.send("Okay") 
     except SocketServer.socket.error : 
      print addr, ">> Connection Failure" 
      return 

     if time_1 - time_0 > 61 : 
      print addr, ">> Timeout" 
      return 

     # Now do something with the buffer 
     # ... 

server = SocketServer.ThreadingTCPServer(('', PORT), RequestHandler) 
server.server_forever() 

は、あなたも、バッファを読んだ後、次のあなたのコマンドはあまりにも時間がかかることはありません確かに区別スレッドでserver.serve_forever()を入れて、要求中にあなたのバッファで何もしない可能性があり取り扱い。したがって、イーサネットポートをリッスンしてバッファに書き込む1つのスレッドと、このバッファから読み込んでデータを処理するもう1つのスレッドがあります。

このバッファをクラスの属性にするか、グローバル変数を使用すると、このバッファを読み取ることができます。

クライアント

import socket 
import time 

IP = xxx.xxx.xxx.xxx # The IP of the server 
PORT = xxxxx   # Same port on which the server is listening 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect((IP, PORT)) 

while True : 
    time.sleep(60.0) 

    try : 
     sock.send("Some crazy message") 
     buff = sock.recv(1024) 

     if buff != "Okay" : 
      print "Something went wrong" 
      return 
    except socket.error : 
     print "Connection Failure" 
     break 

PS:私は...だから何の保証も、このコードをテストしませんでした...返信用

関連する問題