はじめての電気とIoT (7) MQTTで温度をやり取り

センサのデータは短いが連続して送られる

 実験をしていると、温度データは1秒ごとに連続して数時間取得したいことがあります。1日に1回取得して数年間データを蓄積したいという要求もあるかもしれません。そしてセンサの個数が多いと、できるだけ素早く処理をしなくては、データを取りこぼすかもしれません。

 M2MからIoTという言葉が世の中に出始めたころ、IBMのMQTT(MQ Telemetry Transport)が使われ始めたようです。MQってなんでしょうね。

 だれもが利用しているWebサーバとクライアントはhttpというプロトコルを使います。クライアントが絵がほしいと要求したらサーバはそれにこたえて送り出し、接続を切るというように仕組みは単純化されています。メッセージはテキスト・ベースでやり取りが行われています。

 MQTTでは、「ブローカ」が重要な役目をします。昭和の時代、テレビを見ていると、やくざ映画などでブローカは麻薬を売り買いする悪者の代表という印象を持ってしまっているのですが、たんに「仲介者」という意味です。

 httpプロトコルを扱うWebサーバは接続ユーザが増えてくると、負荷分散装置の後ろにたくさんのWebサーバを置くという構成をとります。それは、サーバのドメイン名が一つなので、独立したWebサーバを複数設置したら、ユーザはどのサーバー名でアクセスしたらよいかを判断できなくなるからです。

 MQTTブローカは、まだIoTが本格的に普及していないので、どのくらいの処理能力が必要かわかりません。

 MQTTのシステムは、図のように、複数のデータ(メッセージ)を投げるPublisherと、複数のデータ(メッセージ)を取り出すSubscriberから構成されています。メッセージはTCP/IP上で動きます。



MQTTブローカはすでにラズパイに入っている

 ラズパイにはNode-REDとともに、mosquitto 1.3.4というMTTQブローカがインストールされています。httpサーバに相当しますが、1回の接続で交わされる文字データ量はhttpサーバの1/10以下といわれているので、実験に使う分にはラズパイ自体の負荷にならないかもしれません。

 テスト時には、グローバルな空間にいるテスト用MTTQサーバも利用できます。利用条件などは調べていません。

  • iot.eclipse.org
  • broker.hivemq.com
  • test.mosquitto.org
  • broker.mqttdashboard.com

 

MQTTノードを利用する

 ノード・パレットのinputからmqttノードをワーク・スペースにドラッグ&ドロップし、ダブルクリックして設定画面をだします。

 Serverには、MQTTブローカの名前を入れます。httpプロトコルでないのでhttp://は不要です。ラズパイ自体で動作しているMQTTブローカを利用するなら、ラズパイの「IPアドレス」か「localhost」と入れます。入力や変更をするときは、右の鉛筆のアイコンをクリックします。Portはデフォルトのままです。

 MQTTブローカで一番重要なのが「Topic」です。この名前でデータがやり取りされます。QoSは通信品質を表し、0、1、2の3レベルがあります。2が正確に配信するレベルなので、0から変更しておきます。

 Serverに「localhost」を入力した状態で後の設定を続けます。

 前回、functionノードに、次のjavascriptを記入しました。1-Wireの温度センサ2個の測定データをメッセージに加えます。前回、httpで利用したのと同じです。

msg.payload = "温度計1:"+ msg.payload[0].temp+"℃<br />"+"温度計2:"+ msg.payload[1].temp+"℃";
return msg;

 このノードの出力をmqttノードにつなぎます。これで温度というメッセージを送るPublisher側の設定が完了しました。

MQTTブローカからメッセージを受け取るノードSubscriberの作成

 ノード・パレットのoutputからmqttノードをドラッグ&ドロップします。ダブルクリックして設定画面を出します。Publisherと同じ項目を記入します。

 Serverの入力、変更は、右の鉛筆のアイコンをクリックします。「localhost」を入れます。

 mqttノードの出力にdebugノードをつなぎます。debugノードはデフォルトのままです。

 Deployすると、次の二組のプログラムが動きます。

  • injectノードで1秒ごとに
  • rpi-ds18b20ノードで温度を読み取り
  • functionで二つのセンサのデータを整形し
  • localhostにいるMQTTブローカにメッセージを送るために、mttqノードからPublishする

  • localhostにいるMQTTブローカからメッセージを取り出すために、mqttノードを使ってSubscribeする
  • メッセージをdebugエリアに表示する

 MTTQブローカを家庭内LANにいるlocalhostで実験をしました。インターネットにあるテスト用のMTTQブローカに変更しても、同じように動作します。