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)をつけて送受信します。

やってみた

やってみてる(o^^o)

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です