[IoT][enebular][Sango] enebularと時雨堂さんのSangoでMQTTを気軽に試す

By |2月 17, 2015|enebular, IoT, |


今回はNode-REDをホストしたenebular時雨堂さんのAkaneをホストしたサービスであるSangoを使って気軽にMQTT通信を試してみます。

enebularもSangoもgithubアカウントでソーシャルログインできますので、まずは両方にログインします。

Sangoのダッシュボードは以下のようになってると思います。

次にenebularでmqtt nodeを配置して接続先設定を開きます。

接続先は以下のように設定します。

続いて、このnodeをPublisher(発行側)として登録します。Node-RED的に言いますとmqtt inはSubscriber(購読側)でmqtt outはPublisher(発行側)となります。

そして、以下のようにPublisherであるmqtt outに対して値を入力するinject nodeを配置して”mqtt test”というStringを手動で流すように設定します。

最後に以下のようにinject nodeとmqtt nodeをつないで下画像の赤丸で記したスイッチをクリックします。

Sangoダッシュボードのメッセージ数がカウントアップされればひとまずサーバ(Broker)には送信されてるようです。

それでは同じ要領でmqtt in node(Subscriber)を配置します。

以下のようにdebug nodeを配置して接続してDeploy。続いて先ほどのようにinject nodeのスイッチをクリックしてdebug欄に値が表示されればSubscribe成功です。

これで基本的な動作は完了です。

実際に動かしてみるとRedisのPub/Subに近い感覚がありますが勿論MQTTなりの特徴があります。

特徴については既に以下のような記事や資料で取り上げられていますのでここでは割愛します。

それでは、上記記事または資料から気になったところをキャッチアップしてみます。

Topic

上記でenebularにmqtt nodeを配置する時に”Topic”を指定しました。Topicは階層構造で表すことができるそうなので確かめてみます。

以下のようにSubscriberのmqtt nodeのTopicを別のものに変更します。

以下のようにPublisherのmqtt node側のinject nodeのスイッチをクリックしてみてもDebugに何も表示されません。

Topicが違えばSubscribeできない事が解ります。

では、同じ要領で”/mqtt/#”というTopicにしてみます。これは”/mqtt/”以下はすべてSubscribeするというワイルドカード的な指定なのでDebugに表示されるはずです。

うまく行きました。

このTopicはうまく使えば非常に便利そうです。

この資料の19, 20ページ目にあるように、例えば対象の自動車がある地点を通過したかどうか知るのなら、数メートルとか数キロメートルおきの地点(Topic)をSubscribeしておき、自動車側(Publisher)はその地点を通過した時にTopicに対して何かしら極小の目印となるデータを送るというような設計にすれば色々と負荷が軽減できそうな気がします。

あと、例えば天気など値が必ず数種類に限定されるようなものは、上記座標の下層にTopicとして持つことで、わざわざ「晴れ」とか「雨」というデータを送るのではなく、その地点の<座標>/<晴れ>のようなTopicに極小の目印となるデータを送信すれば同じく負荷軽減になります。

Retain

先ほどのPublisherのmqtt nodeの設定画面に”Retain”という項目があり”false”にしましたが、これを”true”にしてSubscriberのTopicを”/mqtt/#”から”/mqtt/test”とか(またはその逆とか)Deployを繰り返してみましょう。

Deployを繰り返す、つまりSubscriberを再起動するような動きをすると、Deploy直後(Subscriber的に言うと起動直後)に最後に送ったメッセージ(つまりブローカ側では最新のメッセージ)をSubscriberが受信します。

これがRetain機能なのですが、これはPublisherとSubscriberで非同期にメッセージをやりとりするために必要なようです。

ちなみにブローカに保存されているデータ(Retained Data)は長さがゼロのメッセージ(空文字?)を送信すると削除されるようです。

実際、enebularのinject nodeのString(Payload)を空にして送信してみたところRetained Dataは返ってきませんでした。

QoS

次はQoSですが、どうやらSangoのライトプラン(無料)ではQoS 0しかサポートされていないので次回以降にしたいと思います(Durable subscribeとかWillを試す意味でもApache Apolloなどブローカも自前で立てて試してみたいですね)

機能としてはPublishするメッセージのサービスクオリティを3段階で指定できるようです。

※追記: Sango無償プランでもWillなどは試せるようです。