Contents
MQTTってなに?
MQTT:Message Queueing Telemetry Transport
IoT通信プロトコルの一種で短いメッセージを頻繁に送受信することを想定して作られており、軽量かつ省電力で通信することが可能。
様々なデバイスがインターネットに繋がるようになった現代において、遠隔で物を操作する需要が増えつつある。MQTTは多対多の接続が可能でプラットフォームにも依存しない等の理由から多くの「マシン」に対して使用することができる。
MQTTの通信
通信はMQTTブローカーというものを介して行われる。これを経由することで同一ネットワーク内にいなくても各デバイスに通信することができる。

実際に体験する
今回やること
スマートフォンを使用してMQTT通信をブローカーに送り、Raspberry PiのNode-REDで受け取る。

使用するもの
スマートフォン
スマートフォンからMQTT通信を送ることができるようにするためにアプリをインストールする必要がある。
今回使用するのはIoT MQTT panel。事前にインストールしておく
MQTT Brokerの用意
MQTTブローカーを通すと言いながらそれはどこにあるんだと疑問に思った方、今から準備します。
ブローカーを作ることができるサイトはいくつか存在するが今回は
を使用する。制限はあるが基本は無料で使用することができる。

大概のサービスにあるようにこちらも登録が必要になっている。必要事項を送ると登録したメールアドレスからメッセージが来るためそこに貼付されているURLをクリックすることで登録が完了する。
サインインした後My Channelsからブローカーを作成できる。

「Create New」ボタンを押す。

Channel NameとResource nameを設定する必要がある。今回はChannel Nameを「node_red」、Resource nameを「res」と設定した。

「Create channel」を行うとChannel Tokenなるものが生成される。一部伏せさせてもらっているが接続する際重要になってくるため控えておくように。
アプリの設定(送信側)

SETUP A CONNECTIONを押して接続の設定を行う
ここでブローカーに向けて接続する。

空欄の部分を埋める。
Connection nameはタイトル表記であるためお好みで。その次のClient IDは空白のままでもよい、後で勝手に割り振られる。
Broker Web/IP addressは今回使用したブローカーを指定。ポートも同じ。
Add Dashboardの命名も自由で構わない。今回はメッセージと入れてみた。
Additional optionsは隠れているので出現させてUsernameの部分に先程ブローカー作成の際に生成されたChannel Tokenを書き込む。
すべて埋められたら「SAVE」ボタンをタップ。

Connectionsに戻り、先程設定したConnection nameとオレンジの雲マークが出てくれば接続完了。通信ができていないと下図のようになる。


node-red学習をタップするとパネル表示画面に遷移する。
まだ何も追加していないのでADD PANELで新しく作成しよう。
※この画面の雲マークをタップすることで通信のON/OFFが切り替えられる。

パネルのタイプをまず選ぶ
今回は送信のために使用するが、MQTTは相互に通信できるためゲージやグラフ系のセットも入っている。
今回はシンプルな一番上のButtonを使用する。

こちらも空欄を埋めていく。
Panel nameはパネルに表示される名前であるため自由に決めてよい。
TopicはブローカーのどこにMQTT信号を送るかを指定するものであるため先程作成したnode_red/resを必ず設定するように。
Payloadはなしにもできるようだが、Node-RED側で送られたものが見たいので「卍」の文字を入れてみた。
Qosは送受信のレベルを表している。
詳細は省くが、MQTTでは0~2まで設定でき、低いほど脆弱だが通信コストが安く、高いほど堅牢だがその分コストがかかる。
今回は成果が欲しいので2を設定。

追加が完了すると先程までなかったBUTTONという名前の付いたボタンが出現。
タップできるようになっている。
Node-REDのノード接続(受信側)
接続はシンプル、「mqtt in」ノードとデバッグノードを繋げるだけ。これで受け取ったMQTT通信をデバッグノードから表示することができる。

ノードの編集

- mqtt inノードをダブルクリックして編集画面に行く。
- サーバはまだ何も設定していないので新規に追加で鉛筆マークをクリック。
- サーバに「mqtt.beebotte.com」と入力、ポートは1883に設定。
- これで今回使用するサーバを指定できた。
- 追加ボタンを押した後、今度はトピックの編集に行く。


トピックを編集しないと指定したブローカーのどこの中身を持ってくれば良いのかわからない。今回作成したブローカーから取ってくるように指定する。トピックに「node-red/res」と入力こうすることで、node-redチャンネルのresリソースからデータを取ってくるようになる。ここまで出来たら「完了」してノードの編集を終了する。
いざ、実行!
Node-REDをしっかりデプロイできたことを確認してデバッグモードを開き、スマートフォンのボタンを押してみる。

卍というスマートフォンから送られたとしか思えない文字がデバッグノードに出力された。
まとめ
一連の流れを通して、パブリッシャーがブローカーのnode_red/resに通信し、サブスクライバーであるNode-REDが同じくnode_red/resからデータを取り出すフローが理解できた。