おんどとりでIoT その4 node-REDのメッセージ
■メッセージの内容
functionノードでは、プログラムを記述できるのですが、メッセージ自体がどういうものかがわかっていないと、送られてくるメッセージに対して追加や変更ができません。
メッセージを見るためにはdebugノードを使います。左のノード・パレットから、injectとdebugノードをドラッグ&ドロップで中央部のパレットに置き、線で結びます。最小限の構成です。debugノードをダブルクリックして、msgからcomplete msg objectに変更します。Deployします。
timestamp(inject)ノードの左のボタンをクリックすると、メッセージが送られ、右のdebugタブにメッセージ全体が表示されます。
三角印をマウスでクリックすると、整形されてわかりやすく表示できます。
debugノードをダブルクリックします。complete msg objectからmsg.payloadに変更しDeployします。
そうすると、メッセージのpayloadだけが表示されます。これがデフォルトの表示で、メッセージ本体になります。表示されている数値は、システムが用意したものと思われます。次は、明示的に、送るメッセージを作ります。
timestamp(inject)ノードをダブルクリックします。string(文字列)を選びます。
文字を打ち込みます。
Deployして、テストの文字列です(inject)の左のボタンを押すと、debug欄にはpayloadの「テストの文字列です」が表示されます。
debugノードをcomplete msg objectに変更したときの出力は次のようになります。
injectとdebugノードの間にfunctionノードを入れます。Delpoyして実行しても、前回と同じメッセージが表示されます。
デフォルトのfunctionノードには、送られてきたメッセージをそのまま戻す、というプログラムが書かれているからです。
functionノードを変更します。functionノードをダブルクリックして、プログラム・エリアに、1行追加します。
msg.payload = msg.payload + '追加しました。';
完了を押し、Delpoyします。文字列に追加されました。このように、functionノードは、メッセージに対して加工ができます。プログラム言語はjavascriptです。
メッセージ本体はpayloadですが、ほかの項目も送ることができます。デフォルトで項目として存在していたtopicは空っぽですが、それに数字を代入します。
Delpoyして実行すると、送られていることがわかります。
●メッセージをsocketプログラムでおんどとりに送る
functionノードを、下記のプログラムに変更します。
buf = [0xAB,0x01,0x16,0x52,0x0b,0x00,0x01,0x33,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x38,0x00];
msg.payload = new Buffer(buf);
return msg;
左のノード・パレットからtcp requestを置きます。このノードをダブルクリックし、おんどとりのIPアドレス、ポート、タイムアウトの数字を入れます。
functionノードからtcp requestへむずび、Delpoyを押し、プログラムを動かします。
debugエリアには10進で送っているpayloadの値が表示されています。
ラズパイで、ネットワークのトラフィックを可視化するtcpdumpを動かします。ポートを57172に限定して観測します。
sudo tcpdump -i eth0 port 57172 -X -vv
node-REDが動いているラズパイのIPアドレスは192.168.111.50です。おんどとりのIPアドレス192.168.111.52へ「0xAB,0x01,0x16,0x52,0x0b,0x00,0x01,0x33,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x38,0x00」が送られている様子がわかります。その結果、おんどとりからデータが送られてきています。
tcp requestが受け取ったデータをそのままdebugに表示しました。
16進に変更するために、functionノードを追加して、下記のプログラムを入れます。
msg.payload= msg.payload.toString('hex');
16進で温度データが読み出せました。
01 33 06 13 00 b6 04 b8 04 00 00 00 00 00 00 00 00 00 46 00