IoT+WEBのためのホームサーバ計画の実装編2。IoTコントローラの実装の2&HomeServerの実装の1(o^^o)
えぇ-、IoTコントローラの実装も終わってないけど、
HomeServerはIoTコントローラの接続先なので、
同時並行的にやってきます。
HomeServerはWebサーバへのWebSocketの接続もあるのですが、そこは後回しですね。
HomeServerでたてるスレッドは?
●メインスレッド。ホームサーバのメイン。以下のスレッドを連携させて動作させます。
また、以下のスレッドのCallBack関数もここにもあります。
●UDPサーバスレッド
●WebSocketクライアントスレッド
●TCPサーバスレッド
それぞれの機能、、以下です。
UDPサーバスレッド
IoTコントローラから、ブロードキャストされてくるのを受け取るスレッドです。
どうもテストしたところ、途中でIPが変わるとうまく動作しないみたいなので、
定期的に、socketを廃棄+生成ってことをやります。
まぁUDPですから。ちょうどそのタイミングでブロキャス来たら取りこぼしますが、
UDP送る方も、定期的にLOOPしながら送るので、良しとしますよ。
WebSocketクライアントスレッド
WebSocketクライアントは、Webサーバ&WebSocketサーバへの接続のために使います。
IoTコントローラとHomeServerの接続においては、特に使用しませんが、
最終的には連携させるので、とりあえずたてておきます。
TCPサーバスレッド
TCPサーバは、IoTコントローラから何か非同期で送られてきたときに受け取るスレッドです。
また、テスト段階では、ここにテストデータを送り込んで、IoTコントローラとの連携テストを行います。
CODE
#-------------------------------------------------------------
# mhs.py
#-------------------------------------------------------------
if __name__ == '__main__':
#メインのHomeServer
H = hiraHome()
#TCPサーバスレッド。引数にhiraHomeインスタンスを渡す
Q = threading.Thread(target = tcpRecvExec,args=(H,))
Q.start()
#WebSocketクライアントレッド。引数にhiraHomeインスタンスを渡す
W = threading.Thread(target = wsClientExec,args=(H,))
W.start()
#UDPサーバスレッド。引数にhiraHomeインスタンスを渡す
P = threading.Thread(target = udpRecvExec,args=(H,))
P.start()
#-------------------------------------------------------------
さらに、上記のThreadにするための関数を準備します。
#----------------------------------
def udpRecvExec(H):
U = hiraSockUDP()
U.setFunc(H.udpRecv)
U.exec()
#----------------------------------
def tcpRecvExec(H):
T = hiraSockTCP("0.0.0.0",const.HIRA_USE_TCQ_PORT)
T.setFunc(H.tcpRecv)
T.exec()
#----------------------------------
def wsClientExec(H):
print("address:",const.HIRA_USE_WS_ADDR," port:",const.HIRA_USE_WS_PORT)
HOST_ADDR = const.HIRA_USE_WS_ADDR + ":" + str(const.HIRA_USE_WS_PORT) + "/"
W = hiraWsClient(HOST_ADDR)
W.setHome(H)
W.run_forever()
#----------------------------------
こうしてめでたく、メインと、必要な3つのスレッドが動作し始めます。
もちろん、ProcessにするかThreadにするかってのもありますけど、
とりあえず、Processで動作確認してみましょう。
IoTコントローラのタイムアウトのように、
外部からコントロールするクラス(IoTコントローラの時は、hiraTimeOuterクラス)のインスタンスがCOPYじゃこまるときは、Threadにせざるを得ませんが、
ここではどっちでも良いものと、ダメなものがあるので、あとで説明しましょ^^;^^;
シナリオ
シナリオとしては、
【1】テストクライアントから、JSONをTCPでHomeServerで送信➡
※本来はここは、WebサーバのWebSocketでPUSH通信されてくる。
【2】 HomeServerで受け取り、IoTコントローラに送信➡
【3】 IoTコントローラはOKだけ返す➡
【4】 IoTコントローラが画像をbase64にして、HomeServerへTCP送信➡
【5】 HomeServerはストリームを画像にデコード➡
【6】 画像ファイルとして保存
※本来はここで、WebSocketでWebサーバへ送信
【7】 画像ファイルを表示
なお、非同期なので、どのリクエストがどれに対応するかがわからないので、
必ずCLID(クライアントID)をつけて送受信します。
やってみた