1. MQTTとは

センサーモジュール(preMSM)のデータを活用しようとすると、収集・保存・利用するためのネットワーク構築が必要になります。その一つの方法として、MQTT(Message Queue Telemetry Transport)があります。もともとIBMが開発したシステムで、センサーモジュールがPublishしたデータを利用者がSubscribeするという方法です。従来、その間に入るブローカーを立ち上げるのに手間が必要で、外部のMQTTブローカーを利用するのが一般的でした。しかし、外部のMQTTブローカーを利用することは、セキュリティなどの観点から二の足を踏まざるを得ませんでした。MQTT ブローカーを内部のネットワーク内にNode-REDを使って容易に構築できるようになりましたので紹介します。

参考:MQTTの分かりやすい説明

2. MQTTブローカーを使ったネットワークの構築と確認実験

2-1. MQTTブローカーのノードをNode-REDに追加

MQTT ブローカーへのパブリッシャとMQTT ブローカーからのサブスクライバ用のノードはあらかじめNode-REDのノードにリストに存在しています。そのため、MQTT ブローカーへのパブリシュやMQTT ブローカーからのサブスクライブはこれらのノードを使って容易に実現できます。しかし、MQTTブローカーのノードは、自分でノードを追加する必要があります。その方法を説明します。

2-1-1. パレットの管理を開く

Node-REDを起動して、ブラウザからhttp://localhost:1880/にアクセスします。Node-REDのエディタ画面が出てきたら、図1のように、①右上のメニューボタンをクリックして、②メニューを出します。メニューが出たら、③パレットの管理を選択します。

図1. パレットの管理を開く

2-1-2. ブローカー ノードの検索と追加

図2のようなパレットの管理画面がでてきたら、①ノードを追加のタブをクリックします。そして、②ノードを検索の窓に”aedes”と入力し、”node-red-contrib-aedes”を検索します。③”node-red-contrib-aedes”が表示されたら、同じ枠内の右側にある④”ノードを追加”をクリックします。

図2. ブローカーノードの検察

”ノードを追加がをクリックすると、図3のように、確認画面が出てきますので、”追加”ボタンをクリックします。

  図3 ”追加”ボタンをクリック

すると追加処理が始まります。処理が完了したら、図4のようにノード検索の画面の表示が、”追加しました”に変わります。

図4. node-red-contrib-aedesの追加完了

ユーザ設定を占めるために、右上の”閉じる”のボタンをクリックします。以上で、追加が完了です。

エディタ画面の左側のノード一覧に”aedes broker”のノードが追加されています。

図5. aedes brokerノードの追加を確認

2-2. MQTT ブローカーのノードを使ってローカルMQTT ネットワークを構築

MQTT ブローカーはローカルでも動作します。そこで、MQTT ネットワーク構築の練習として、ローカルマシンにMQTTネットワークを構築して、動作を確認してみます。実際に運用する場合には、他のマシンをMQTTにしてもいいですし、他のマシンをパブリッシャやサブスクライバにしてもいいです。

2-2-1. MQTT ブローカーノードの配置と設定

前項で追加したMQTT ブローカーのノードを図6のようにエディタ上にドラッグして配置します。

図6. MQTT broker ノードの配置

次に、ブローカーノードをダブルクリックして設定画面を表示してみます。ブローカーノードの設定は、特に変更しなくても動作に問題はありません。MQTT のポートは、1883が使用されていることが分かります。”中止”をクリックして、設定完了です。

図7. aedes brokerノードの編集

2-2-2. MQTT パブリッシュ ノードの配置と設定

ここからMQTT のパブリッシュノードの配置と設定を行います。

まず、MQTT パブリッシュノードをドラッグしてエディタ画面に配置します。次に、MQTT パブリッシュノードの入力に、パブリッシュするデータを出力するノードを接続します。
今回は、インジェクトノードで固定メッセージ” My first MQTT Broker”とパブリッシュすることにします。

図8. MQTT パブリッシュノードの配置

MQTT パブリッシュノードの設定です。MQTT パブリッシュノードをダブルクリックして、設定画面を表示します。

サーバーを新規に追加するために、図9のように①右側の鉛筆マークをクリックします。

 

 

図9. MQTT パブリッシュノードの設定(1)

すると、さらに図10のような設定画面が現れます。サーバの欄に、今回は、①localhostと記入します。MQTT ブローカーが別の機器の場合は、そのMQTTのブローカーのある機器のIPアドレスを記入します。記入が終わったら、右上の②追加ボタンをクリックします。そのあとに出てくる設定画面で、右上の完了ボタンをクリックして、MQTT パブリッシュノードの設定は完了です。

図10. MQTT パブリッシュノードの設定(2)

次に、インジェクトノードの設定を行います。インジェクトノードをダブルクリックして、図11のような設定画面を表示します。①パブリッシュする内容を、msg.payloadの欄に記載します。今回は、”My first MQTT Broker”と記載しました。その後、②右上の完了ボタンを押します。

図11. インジェクトノードの設定画面

以上で、MQTT のパブリッシュ側の設定は完了です。

2-2-3. MQTT サブスクライブ ノードの配置と設定

ここから、MQTT サブスクライブノードの配置と設定を行います。

まず、図12のように、MQTT サブスクライブノードをドラッグしてエディタ画面に配置します。次に、MQTT サブスクライブノードの出力に、データを利用するノードの記述を行います。
今回は、デバッグノードを繋ぎ、デバッグ画面でサブスクライブした内容をモニタします。

図12. MQTT サブスクライブノードの配置

次に、MQTT サブスクライブノードの設定を行います。MATT サブスクライブノードをダブルクリックすると、図13のような設定画面が現れます。

サーバの設定が必要であれば選択します。今回は、自動でlocalhostが選ばれていましたのでそのままとします。選ばれていない場合は、localhost を選んでください。トピック欄に、①サブスクライブするトピック名を記入します。今回は、”/public”と記入します。記入後、②完了ボタンをクリックします。

図13. MQTT サブスクライブノードの設定画面

以上で、MQTT サブスクラブノードの設定は完了です。

最後に、右上のデプロイボタンをクリックして、ローカルMQTTネットワークの構築が完了しました。

図14. ローカルMQTTネットワークのデプロイ

2-2-4. MQTT パブリッシング/サブスクライブ実験(1)

さて、ここからは上記で構築したローカルMQTTネットワークの動作の確認を行います。デプロイが完了し、MQTT のサーバ名やトピックス名が合致していると、図15に示したように、MQTT のブローカーノードやパブリッシュノード、サブスクライブノードに接続していることを表す緑色の四角が現れます。この状態で、インジェクトのボタンを押すと、右側のデバッグ画面に”My first MQTT Broker”の文字が表示されます。インジェクタからパブリッシャに文字列が送られ、MQTT のブローカーを介して、サブスクライバに送られます。そして、デバッグノードの送られた文字がデバッグ画面に表示されたことが分かります。実験成功です。

MQTT ブローカーが別の機器でもIPの設定が異なるだけで、動作は同じです。

図15. ローカルMQTTネットワークの動作実験画面

2-2-5. MQTT パブリッシング/サブスクライブ実験(2)

次に、トピックスが異なる場合に、混信することなく、パブリッシャのトピックスの内容が、同じトピックスをサブスクライブしているサブスクライバに届くかの確認実験をしてみます。

図15に追加で、同じようにパブリッシュノードとサブスクライブノードを1つずつ配置し、トピックス名を変えて設定します。

追加分は、図16に示すように、トピックス名を”/local”としています。その後、デプロイします。

そして、トピックス”/public”のインジェクトボタンを押します。すると、図16のデバッグ画面の上段のように、”My first MQTT Broker”の文字が表示されました。次に、トピックス”/local”のインジェクトボタンを押すとデバッグ画面の下段のように”This is my local message.”と表示されました。それぞれのボタンでそれぞれのパブリッシュノードからそれぞれの文字列がMQTT ブローカーにパブリッシュされた結果だということが分かります。

では、サブスクライバに正しく届いているかどうかを確認します。デバッグノードの文字の上にカーソルを持って行くと、その文字を出力したデバッガが赤枠で表示されます。

図16では、上段のトピックス”/public”からパブリッシュされた文字にカーソルを合わせています。この場合、トピックス”/public”のMQTT サブスクライバにつながったデバッグノードが赤枠で表示されていますので、”My first MQTT Broker”の文字列は、正しくトピックス”/public”にサブスクライブされていることが分かりました。

図16. ローカルMQTTネットワークのトピック違いの動作実験(1)

 

同様に、図17に示すように、下段側の文字列にカーソルを合わせてみると、トピックス”/local”のサブスクライブノードに接続されたデバッグノードから出力されていることが分かります。文字列”This is my local message.”は、正しくトピックス”/local”にサブスクライブされたことが分かりました。

図17. ローカルMQTTネットワークのトピック違いの動作実験(2)

以上のように、Node-RED上で簡単にMQTT ブローカーを作成し、データの転送ができることが確認できました。