Node-REDでMQTT Pub/Sub
はじめに
本記事はOKIの「AIエッジコンピューター」と呼ばれる AE2100 というゲートウェイ製品にNode-REDを載せて、ローコードIoTのプラットフォームにしようという記事の その4 実践編 2「Node-REDでMQTT Pub/Sub」 です。
その1 準備編「PythonでRS-485圧力センサーシミュレータ作成」
その2 構築編「DockerでローコードIoTプラットフォーム構築」
その3 実践編 1「Node-REDでダッシュボード作成」
その4 実践編 2「Node-REDでMQTT Pub/Sub」 (本記事)
前編では RS-485入力の圧力値をNode-RED でローカルに作ったダッシュボードにリアルタイム表示しました。
もうそこまでで十分なわけですが、いちおうIoT関連の記事なので、ネットワークを利用するところまでやらせてください!
こんなことやります
本編で行うのは最後の 4 MQTT Pub/Sub になります。
RS-485で受信した圧力値をクラウドに飛ばしてIoTらしいアプリに仕上げます。
使用するネットワークプロトコルはMQTTです。
MQTT
Node-RED 経験者なら、ほぼ間違いなくMQTTを使ったことがあるでしょうが、ここではMQTT初心者向けに少しだけ解説します。
MQTTとは、パブリッシュ/サブスクライブ型のメッセージキューです。
サーバーであるMQTTブローカーを仲介者として、複数のクライアントがサブスクライブ(購読)とパブリッシュ(発行)に分かれ、トピック名をキーワードとしてメッセージの送受信を行います。
1つのクライアントがパブリッシュとサブスクライブの両方を行うこともあります。
Node-RED ならば、MQTT、Node-RED 両方の初心者でも、設定だけで簡単に MQTT を試すことができます。
なおMQTTブローカーには、test.mosquitto.org を使わせていただきます。
Node-RED フロー作成
Node-RED のフローエディタ構成を再掲しました。
ワークスペース内のフローがこれから作成するフローです。
流量制限ノード
まず上図のフローの左下に追加した "1 data/10 sec" ノードですが、これは毎秒受信する圧力センサーのデータを10秒に1回に流量制限するものです。
無料で使わせていただくMQTTブローカーに毎秒データを送りつけるのは気が引けるので、遠慮して10秒に1回にします。
これをワークスペースに置いて、ダブルクリックして以下のように設定して完了します。
このように流量の制限が設定だけで簡単にできてしまいます。
MQTTパブリッシュノード
次に、MQTTブローカーにセンサーデータをパブリッシュするノードを設定します。
パレットからこの mqtt out ノードを掴んで、ワークスペースにドロップします。
ダブルクリックして設定します。
まずは鉛筆アイコンをクリックして、MQTTブローカーの設定画面に移行します。下の右にある設定画面が開きます。
名前はとりあえず test.mosquitto.org としておきましょう。
サーバは今回は test.mosquitto.org と指定する必要があります。
ポートはデフォルトの1883でOKです。
クライアント名は、何でも良いのですが、ここでは AE2100 とします。
以上3つ設定したら、更新をクリックして初めの設定画面に戻ります。
トピック名はMQTTブローカー内でユニークである必要があります。
今回は ae2100/pressure とすればOKでしょう。
QoSは 1 にして、少なくとも1回はMQTTブローカーにデータが届くまで(複数回届く可能性があります)パブリッシュするようにします。
mqtt out の設定が完了したら、フローエディタの右上の デプロイ をクリックして保存・実行しましょう。
下図のように test.mosquitto.org ノードが 接続済 になったでしょうか?
ここでは 接続済 にならなくてもOKです。後ほど別の方法をご紹介します。
次の確認にすすみましょう。
フローの改造
RS485ノードと test.mosquitto.org ノードが接続済みになったので、1秒ごとにRS-485で入力される圧力データが10秒ごとにMQTTブローカーに送信されているはずです。
MQTTサブスクライブしてそのデータを受信してみましょう。
一度、MQTTブローカーにサブスクライブしておくと、以降パブリッシュがある度に、MQTTブローカーがパブリッシュされたデータを転送してくれます。
本来、サブスクライブは別クライアントで行うべきでしょうが、今回は Node-RED での説明を兼ねて、今まで使ってきたフローを2つに分けて、上の図のMQTTクライアント 1と2を Node-RED の1つのワークスペース上に実装します。
上のフローはセンサーデータを収集してクラウドにアップロードするエッジゲートウェイを想定しています。
RS485ノードからの圧力データはそのままダッシュボードに表示せず、MQTTブローカーにパブリッシュするだけにします。
そして下のフローは、エッジからのデータを受信してダッシュボード表示するWebアプリケーションを想定しています。
MQTTブローカーから転送された圧力データを受信してダッシュボードに表示します。
作業内容としては mqtt in ノードを新規に追加して、gauge と chart ノードをこちらにつなぎ替えるだけです。
ダッシュボードのプロットが10秒に1回になれば、MQTTサブスクライブが確認できるはずです。
MQTTサブスクライブノード
それではmqtt in ノードを追加・設定しましょう。
パレットから下図のノードをワークスペースにおいて、ダブルクリックです。
サーバにはすでに test.mosquitto.org:1883 と入っているはずです。
(違う場合、ドロップダウンメニューで選択してください。)
トピック名にはパブリッシュ側の mqtt out ノードに設定した ae2100/pressure を入力します。
出力はデフォルトの自動判定のままにして、文字列として受信するようにします。
名前は test.mosquitto.org とでもしておきましょう。
最後に、RS485ノードに接続している gauge と chart のワイヤーを削除して、以下のように今追加した mqtt in ノードの右に置き、接続し直します。
以上で設定は終わりです。デプロイ をクリックして、保存・実行してみてください。
ダッシュボードに10秒に1回、圧力値がプロットされるはずです!
test.mosquitto.org に接続できない!
実はこの無料サーバーは時々つながらない事があります。
このサーバーはMQTTブローカーのリファレンス実装を公開している mosquitto.org により運用されているのですが、我々MQTTクライアント側がテストのために使用する目的だけでなく、MQTTブローカー自体をテストする目的でも使われており、不安定になったり、ダウンすることがあるそうです。
運悪くちょうどダウンしている場合、2,3日待ってトライしてみてください。
いや、今すぐ試してみたい!場合、このサービスはいかがでしょうか。
毎日パスワードを変更する必要がありますが、登録なしに無料で使えます。
もしくは node-red-contrib-mqtt-broker ライブラリを追加して、Node-RED上でMQTTブローカーを立ち上げる方法もあります。
さいごに
AE2100 によるローコードIoT開発、いかがだったでしょうか。
今回のサンプルアプリはローコードどころか、ノーコードでできてしまいました。
インタラクティブにアクセスする手段がSSHクライアントかXサーバー経由くらいしかないAE2100の使い方として、他のマシンでコンテナ内にアプリを作って、AE2100にそれをデプロイして実行するのが通常だと思います。
しかしNode-REDが動くと、AE2100で直接開発しても全く苦にならず、特に今回のシリアル通信のようなAE2100のハードウェアを使う場合、AE2100で直接開発することになるので、Node-RED は大きな助けになるはずです。
確かにNode-REDはメモリ食いだし、処理速度も速いとは言えないのですが、1秒くらいのレスポンスなら十分ではないでしょうか。
(まずNode-REDでぱぱっと作ってみて、処理速度が足りなさそうだったら、Node.jsやC言語で作り直す、というやり方もあるでしょう。)
これで4編にわたる記事もようやく終わりになります。
こんなに長くなるとは思わなかったのですが、AE2100 のユーザーのみなさんに少しでもお役に立てば幸いです。
最後の最後にお約束ですが、本記事に関してOKIは何も関知しないので、記事の内容に関してOKIに問い合わせることがないようにお願いいたします。