Node-REDと先っぽのマイコンの間の通信はMQTTばかり使ってきました。しかしNode-REDの「パレット」には他のNetworkプロトコルのノードも並んでいます。httpなど上位レイヤーもあれば、TCP/UDPなど下位レイヤもあります。今回は下のレベルで「投げっぱなし」で「軽い」UDPを使ってみたいと思います。
※「ブロックを積みながら」投稿順 index はこちら
さてNetwork関係の機能を実験してみるためには通信の相手(対向機)が欲しいです。対抗機はパソコンでもラズパイでもまともなOS走っている装置であれば大抵のNetworkプロトコルスタックが装備されているので可能ではあるのです。しかし、ちゃんとしたOSほど「使っている部分もあり」勝手な設定ができないじゃないかと思います。
そこで飛んで火にいる夏の虫、いや虫ではありませんな「うさちゃん」Rabbit4000(Z80のほぼほぼ上位互換の強化された「8ビット」マイコン)の登場です。Ethernetインタフェースを備え、ほぼほぼベアメタル環境にて、所望のプロトコルを動作させることができるのでネットワークの実験には最適。別件投稿にて、既にUDP ECHO に反応するテストプログラムを書き込み済です。UDPでECHOパケットを投げつければ、そのままオウム返しに返してくれる状態になっています。
今回の実験フロー
今回のフローは独立したフローが2つです。
-
- UDP in ノードを使った、UDPパケットの受信と表示のフロー
- UDP out ノードを使った、UDPパケットの送信フロー
以下のような感じ。
上記フローで、ことさらに49152と書かれていますが、これはUDPのポート番号です。もともと対向機のうさちゃんは、UDP ECHO(ポート番号7)で動作させていました。しかし、Node-RED側に問題が。以下をご覧くださいませ。
UDP ECHOの7番はウエルノウンポート(1023番以下)なので、特権ないと開くことができないようです。Node-REDサーバーには特権つけてないので使用不可。また、Node-REDに特権つけたくありません。
そこでうさちゃん側にお願いしてECHOのポート番号を変更してしまいました。うさちゃん側のCのソースの以下の定義(UDP ECHOのポート番号7番)を
#define LOCAL_PORT 7
プライベートポート49152番に変更(49152番以降は誰か他のプログラムが使っていなければ勝手に使って良いんじゃないかと思います。知らんけど。)
#define LOCAL_PORT 49152
再コンパイルして、うさちゃんに書き込めば(1箇所書き換えてコンパイルとFlash書き込みで実質1分以下くらいの時間)、UDPで49152番ポートに投げつけられたパケットをオウム返しにしてくれるようになりました。うさちゃん便利。
フロー内のノードの設定
まずは、送信側フロー(下側)のInjectノード。Node-REDエディタ上でボタンを押すとHELLO FROM NODEREDという文字列を送り出すだけです。こんな感じ。
続いて、上から文字列を受け取ってネットワークに流しだす udp outノードの設定。ここは「うさちゃん」のIPv4アドレス 192.168.2.59の UDP ポート 49152番にmsg.payloadに載って来た文字列をそのまま投げる設定。投げた時点でのポート番号はテキトーでお願いと。
一方、受信側のUDP inノードの設定がこちら。UDPポート49152番に到来したパケットのペイロードを文字列として解釈して msg に載せて後続ノードに送りだすと。
実行結果
送信用のInjectノードのボタンを押すと、udp out ノードから送信されたUDPパケットがうさちゃんへと送られます。これを受信したうさちゃんは、送受の方向こそ逆にしますが、同じペイロードのパケットをそのまま打ち返してきます。するとNode-REDサーバーが走っているRaspberry Pi 3 model B+が受信してNode-REDサーバーに伝えてくる、と。その結果が udp in ノードを経由して以下のデバッグウインドウへ。なおうさちゃんのIPアドレスは、192.168.2.59です。
うさちゃん経由のラウンドトリップ成功。Node-REDをNetworkのサーバに使うのは楽にできそうな気がしてきましたぜ。ホントか?