RaspberyyPiに写真を撮らせてスマフォで見るだけなら、家にサーバを立てれるなら簡単だが、
汎用性をもってレイヤ分けをして実行するとなると、段階がいくつ増えてちょっと面倒になる。
まず、写真を転送する後のフェーズから考察しよう。
魔法のハコCLIENT(以下、MHC)に実行命令が出て、写真を撮ったとする。メモリ上のtmpあたりに保存したとしよう。
そしてこれを、順番で言えば、魔法のハコSERVER(以下、MHS)に転送することになる。
ここは、MHC→MHSへ、WebSocket転送する。
まぁもちろんUDPという選択もあるにはあるけど、ここでもWebSocketにしておく。
ここでデータを受け取ったMHSが今度はWebServerに対してWebSocketする。
そして最後に、スマフォのブラウザにWebSocketするという流れとなる。
よって、
【MHC】→(WebSocket)→【MHS】→(WebSocket)→【WebServer】→(WebSocket)→【スマフォ】
という、WebSocketリレーになる。
さて、それぞれのWebSocketがいつ作られるかと言うことになる。
こんどは、逆に見ていこう。
ここでWebSocketが生成される。
よって、実は、そのjavascriptはWebServerでなくて、localhostでも理論的には成り立つ。
javascriptの中からWebSocketするのだから。
よって、
スマフォ→WebServer にconnectionを張りに行く。
よって、
MHS→WebServer にconnectionを張りに行く。
ちょっと考えたらわかることであるが、
1も2も、WebServer側からスマフォにもMHSもConnectionを張ることは構造的に不可能なのだから、
当然このような方向となる。
MHSが先に起動されてWebServerにconnectionを張ってから、MHCが起動(接続)して、MHSにConnectionを張りに行く。
よって、
MHC→MHS
となる。
時系列で言えば、2→3→1となる。
でも、実は、これではうまくいかない。
なぜなら、上記の例のようにすると、
スマフォ:WebSocketCLient
WebServer:WebSocketServer
MHC:WebSocketClient
MHS:WebSocketServer + WebSocketClient
となる。
ようするに、MHSが両方の機能を有することになるが、この2つに連携関係が無いからだ。
もちろん、連携関係を作ってもよいのだが、複雑になるばっかりなので、とりあえずはやめておく。
そしてよくよく考えてみる。
WebSocketが必要なのは、どちらかからしかConnectionを張れない時だ。
どっちからも張れるなら、そもそもWebScoketでなくてもいいっちゃいいのだ。
でもWebSocketにしちゃいけない理由も無いので、
独自プロトコルであれこれやるのもいいけど、ここはWebSocketを使うことにする。
その場合、Temporary的にWebScoketを生成して破棄するような方法にする。
別に張りっぱなしでも良いのだが、張りっぱなしでも結局、切れたときとか、再接続とかを気にしなくちゃいけないので、
オーバーヘッドが問題にならなければ、そして、1対1の関係の時は、都度、張ってもよいのではということに今回は落ち着かせることにする。
で、図にすると、以下のようにしますた。
汎用性をもってレイヤ分けをして実行するとなると、段階がいくつ増えてちょっと面倒になる。
まず、写真を転送する後のフェーズから考察しよう。
魔法のハコCLIENT(以下、MHC)に実行命令が出て、写真を撮ったとする。メモリ上のtmpあたりに保存したとしよう。
そしてこれを、順番で言えば、魔法のハコSERVER(以下、MHS)に転送することになる。
ここは、MHC→MHSへ、WebSocket転送する。
まぁもちろんUDPという選択もあるにはあるけど、ここでもWebSocketにしておく。
ここでデータを受け取ったMHSが今度はWebServerに対してWebSocketする。
そして最後に、スマフォのブラウザにWebSocketするという流れとなる。
よって、
【MHC】→(WebSocket)→【MHS】→(WebSocket)→【WebServer】→(WebSocket)→【スマフォ】
という、WebSocketリレーになる。
さて、それぞれのWebSocketがいつ作られるかと言うことになる。
こんどは、逆に見ていこう。
■1■ 【スマフォ】←→【WebServer】
スマフォからWebServerを経てHTMLが画面上に表示されるとともに、javascriptもLOADされ、ここでWebSocketが生成される。
よって、実は、そのjavascriptはWebServerでなくて、localhostでも理論的には成り立つ。
javascriptの中からWebSocketするのだから。
よって、
スマフォ→WebServer にconnectionを張りに行く。
■2■ 【WebServer】←→【MHS】
MHSの起動時に、WebServerに向かってConnectionを張る。よって、
MHS→WebServer にconnectionを張りに行く。
ちょっと考えたらわかることであるが、
1も2も、WebServer側からスマフォにもMHSもConnectionを張ることは構造的に不可能なのだから、
当然このような方向となる。
■3■ 【MHS】←→【MHC】
これはどちらが先に起動するかという話で考えるならば(実装としてはMHSが後でも成り立つようにはするものの)、MHSが先に起動されてWebServerにconnectionを張ってから、MHCが起動(接続)して、MHSにConnectionを張りに行く。
よって、
MHC→MHS
となる。
時系列で言えば、2→3→1となる。
でも、実は、これではうまくいかない。
なぜなら、上記の例のようにすると、
スマフォ:WebSocketCLient
WebServer:WebSocketServer
MHC:WebSocketClient
MHS:WebSocketServer + WebSocketClient
となる。
ようするに、MHSが両方の機能を有することになるが、この2つに連携関係が無いからだ。
もちろん、連携関係を作ってもよいのだが、複雑になるばっかりなので、とりあえずはやめておく。
そしてよくよく考えてみる。
WebSocketが必要なのは、どちらかからしかConnectionを張れない時だ。
どっちからも張れるなら、そもそもWebScoketでなくてもいいっちゃいいのだ。
でもWebSocketにしちゃいけない理由も無いので、
独自プロトコルであれこれやるのもいいけど、ここはWebSocketを使うことにする。
その場合、Temporary的にWebScoketを生成して破棄するような方法にする。
別に張りっぱなしでも良いのだが、張りっぱなしでも結局、切れたときとか、再接続とかを気にしなくちゃいけないので、
オーバーヘッドが問題にならなければ、そして、1対1の関係の時は、都度、張ってもよいのではということに今回は落ち着かせることにする。
で、図にすると、以下のようにしますた。
コメント
コメントを投稿