スキップしてメイン コンテンツに移動

投稿

10月, 2018の投稿を表示しています

魔法のハコ-ESE-UPnP

魔法のハコはつないだだけでつながる。 よく家電とか、、プリンタとか、ネットワークケーブルをつないだだけで使えるものがある。 あれみたいなものだ。 つながるということは、 こっちから見つけに行く 向こうから見つけてもらう のどちらかだ。 魔法のハコクライアント(MHC)は、魔法のハコサーバ(MHS)に見つけてもらうということで考える。 実際には、【MHCがネットワークにつながったとき、マルチキャストパケットをLOCALネットワーク上に投げて、MHSにキャッチしてもらう】という方法にする。 実際には、 (1)MHSがUDPでマルチキャストパケットを受け取るようにしておく。 (2)MHCがマルチキャストを投げる。 (3)MHSがマルチキャストを受け取り、投げ元のIPに対して、TCPでMHCに情報を送る。 UDPはマルチキャストパケットの時のみ使用。そのあとは、互いのIPがわかるので、TCP/IPででれでれ情報交換するという形である。 その後、MHCはWebSocketでMHSとつながることになる。 クライアントの方はPHPで書くとこんな感じ。 試しにJSONをbase64して送っているけど、とりあえず今は使っていない。 $udp_port = 41900; $tcp_port = 41901; $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP ); socket_set_option( $sock,IPPROTO_IP,MCAST_JOIN_GROUP, array( 'group'=>'239.255.255.250', 'interface'=>0 )); $msgAR = array(); $IP = getHostByName(getHostName()); $msgAR["system"]["ip"] = $IP; $msgAR["system"]["type"] = "checker"; $msg = json_encode($msgAR); $a6...

魔法のハコの最初の設計

テストを経て、最初のテスト版を設計してみます。 よくわからない図ですが、、こんな感じででれでれメモを描き、 こんな感じにしました。 意地でも基本部分をPHPでやってみようという計画です。 そもそもWebSocketのクライアント部をPHPでやってみるサンプルなんか、 あんまり無いので、っていうところもあります。 JOB-ticketなるものが描いてありますが、 まぁ最終的になんでもできるようにということを考え、 ここはC++にしときます。 PHP動かしたければ、C++からPHPを呼べばいい。 まぁテスト版ですからね。 そんなとこでいいと、思います。 PHPのWebSocketのClient的なものは、 https://github.com/Devristo/phpws をつかってみます。 まぁそもそもEventDrivenで無い言語であれこれやろうっていうところに無理がありますけどね。

魔法のハコの設計のためのテスト-1

魔法のハコ計画の全体像は以下です。 で、最初は一番きになるところの、以下を考察します。 もちろん最終的には違う方法(libwebsocket)を使うつもりですが、 とりあえず、テストも含めてサーバはPHPで、クライアントはブラウザ上のjavascriptでテストしてみますね。 一応、こんな感じで。 で、最初の登録部分ですが、これは、サーバが発行する一意なIDです。 一意なのは瞬間的なもので、魔法のハコを識別するものでは無いです。 よって最初は、 { "witchlist":{ "3":{ あれこれ } "6":{ あれこれ } } } みたいな感じにしときましょう。テストだし。 登録がきたら、登録。 削除がきたら、削除。 サーバ側としては、onOpneとonCloseに対応させることになります。 もちろん、知らないうちに切れてたとか、バイタルのチェックとか、 そういうのは後回しですよ。 で、SRCコードは、、。 namespace MyApp; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; function DBG($v){ file_put_contents("/etc/log/debug01.jsn",$v); } class Finred implements MessageComponentInterface { protected $clients; protected $finredAR; //------------------------------------- public function __construct() { // $this->clients = new \SplObjectStorage; $this->clients = array(); $this->finredAR = array(); } //------------------------------------- public function...

Ratchet@PHPで自宅にhttpsでWebsocketするサンプルを動かす

今日のゴールは、外から自宅にhttpsでWebsocket@Rachet@PHP@WindowsServerするサンプルを動かすことです。 ※そのうち、Websocket@libwebsocket@Ubuntuをやりますね。 そもそもRatchetはポートを指定してws:// をうけつけてくれるものなので、 自宅サーバがそもそもNginxでリバースプロキシしてるので、 難しいことはせずに、それに則った形で設定を行います。 要するに、wss://をリバースプロキシで受けて、Ratchetが動作するサーバへ転送するだけです。 もちろん、プロキシにはUpgradeヘッダ(HTTP 1.1)への対応が必要となりますね。 絵にかくと、以下ですね。 自宅のhttpsはletsencryptというのを使用しています。 Windowsで使う場合には、以下が参考になりますね。 https://webbibouroku.com/Blog/Article/letsencrypt-setting ここではHTTPSそのものの設定に関しては記述しませんです。 リバースプロキシしてるNginxのconfの該当部分は以下としました。 ※abcd.comは実際のドメインに。 server { listen 443; include ssl-abcd.com.conf; server_name ws.abcd.com; proxy_set_header Host $http_host; access_log /log/ssl-ws-abcd.com.log main; location / { proxy_pass http://192.168.xxx.xxx:8080; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1; } } これによって、javascriptから、 wss://ws.abcd.com が、 http:192.168.xxx.xxx:8080 に転送されることになるので、転送先にRatc...

FINRED-WebSocket/DLNA

FINREDプロジェクト、とりたてて新しい技術を使うわけではない。 で、ひとつひとつ確認しながら、進めていく。 ポイントとなるのはいくつかあるけれど、おおまかに以下が重要ポイントだ。 WebSocket DLNA 独自プロトコル とくにWebSocketは今までサンプルを動かすくらいしかやったことないので、 テストしながら進めてみる。 最終的にはC++屋なので、C系で統一したいところだが、 テストとしてはC及びPHPを使用することにする。 PHPを選んだことに特に意味はなく、 こういうことはPythonとかのが一般的かもだけど、 逆に情報があまり少ないものをやってくのも意味があるとおもうので、 やってみる。 まず、WebSocketとは何かとか、そういうのはここではやらない。 まぁ今回は、PUSH通信のためにこれを使うことになる。 では、PHPとCの両方でテストしながら色々やってみることにする。 Ratchet RatchetはPHPのWebSocketライブラリである。 ではサンプルを実行させてみよう。 インストールに関しては、 ここらへん が参考となる。 ちょっと変更して実行してみた結果は以下である。 単純に、デバッグコンソールから、 conn.send('Hello World!'); と打っただけの結果だ。 変更点は以下である。 SplObjectStorageでクライアントを管理していたが、これを単なるARRAYにした ARRAYのキーを、ConnectionInterface::resourceIdとした これは、クライアントを色々管理しやすくするためにこうしただけだ。 変更前をコメントで残した形でのSRCが以下。 //------------------------------------- public function __construct() { // $this->clients = new \SplObjectStorage; $this->clients = array(); } //------------------------------------- public function onOpen(Connec...

FINREDプロジェクト。

FINREDプロジェクト。 IoTとかと言われて久しいが、今一つのところで止まっている感がある。 そうだ。難しすぎるのだ。 用意されてるものだけではつまらないし、お遊び程度だ。 でも、だれでもかれでも工作できるわけでもない。 人々ができるのは、だいたい以下くらいのことだ。 電源を入れる LANケーブルをつなぐ 設定画面をブラウザで開いて設定をちょこっとする。 個別のものは、I/Fを公開すれば、『きっとだれかが作ってくれる』であろう。 それが、OPENな環境というものだ。 あとは、そう、、 応用で実務に使うときくらいに、ビジネスになれば幸せだ。 CODE