IoT用軽量通信プロトコルMQTTを試す

 これまでESP32などで計測したデータの伝送はそのESP32などにWebServerをインストールしておき、

 計測についてはそのindex.htmlの中に計測値を埋め込み
 制御はURLに書き込むことで実現していたが、

HTMLは負荷が重たくIoT用にはもっと軽いプロトコルが適しているように感じていた。
 ネットで調べるとMQTTなるプロトコルがあることを発見。どの程度軽量なのかは試してみないと分からないので色々試してみた。

 調べてみると、MQTTの通信はIBMなどが開発した通信プロトコルでBrokerと呼ばれるサーバーに相当するものを介して、発信者(publisher)と受信者(subscriber)との間でデータをやり取りする。
 サーバーを介することで通信上のトラブルなどをある程度吸収できる。というもののようである。



以下に試したことを順番に列記する。

①Windowsパソコン上にBroker publisher subscriberを立ち上げ
②ラズパイ上でのBrokerとclientの立上
③clientにmqttBoxを使用
④ESP8266からの温度、湿度の伝送

①1台のWindowsパソコン上にBroker publisher subscriberを立ち上げ、publisherからのメッセージょsubscriberで受信する。

  Windowsパソコンの準備
  mosquittoから使用するパソコンの仕様に合わせ64bit版あるいは32bit版をダウンロードする。私の場合はCPUがATOMの非力パソコンのため32bit版をダウンロードした。
 ダウンロードしたmosquitto-1.6.10a-install-windows-x32.exeを実行すると
 ・Brokerであるmosquitto
 ・publisherであるmosquitto_pub
 ・subscriberであるmosquitto_sub
の3種類の実行ファイルなどがインストール途中で指定したフォルダーに展開される。
インストールするフォルダーはどこにあってもよさそうである。
Brokerの実行は、コマンドプロンプトを立ち上げ、mosquittoをインストールしたフォルダーに移動して、
>mosquitto -v
で起動する。-vは経過表示である。無くても良いが指定しておくと動いていることを確認できる。


次にpublisher用とsubscriber用に2つのコマンドプロンプトを立ち上げる。
最初のコマンドプロンプトにsubscriberを立ち上げる。mosquittoをインストールしたフォルダーに移動して。
>mosquitto_sub -t test -h localhost
で待ち受け状態となる。ここで-tはトピックと言ってpublisherとsubscriberの間で合致させる合言葉の様なものである。これが合わないと当然publisherが送信してもsubscriberでの受信は出来ない。
-hは使用するBrokerが動いているPCのアドレスである。今回は一台のPCで全てやっているのでlocalhostとか127.0.0.1である。

次にpublisherの起動である。
3番目のコマンドプロンプトでmosquittoをインストールしたフォルダーに移動して
>mosquitto_pub -t test -h localhost -m "Hellow World"
-t と-hの意味はsubscriberと同じである。-mは送るメッセージを示している。今回はHellow Worldである。
subscriberの左側の最下行にそのメッセージが表示されている。subscriberは稼働しっぱなしであるが、publisherはメッセージを送ると終了する。

〇subscriber


〇publisher


 これでpublisherが発したメッセージをsubscriberが受けとていることが分かる。
 今回は一台のPCで全て行ったが当然別々のマシンでも同様に動作する。
 また、Brokerはインターネット上にもあるのでネットワークが繋がっていればそれを使うことも出来る。

②ラズパイ上でのBrokerとclientの立上

 mosquittoはwindowsだけでなくラズパイでも稼働する。
pi@raspberrypi:~ $ sudo apt-get install mosquitto
でインストールし、
pi@raspberrypi:~ $ sudo /etc/init.d/mosquitto start
[ ok ] Starting mosquitto (via systemctl): mosquitto.service.
で常駐する。その状況を見るには、
pi@raspberrypi:~ $ sudo systemctl status mosquitto
● mosquitto.service - Mosquitto MQTT v3.1/v3.1.1 Broker
   Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset
   Active: active (running) since Thu 2020-07-16 09:22:19 JST; 3min 8s ago
     Docs: man:mosquitto.conf(5)
           man:mosquitto(8)
 Main PID: 2154 (mosquitto)
    Tasks: 1 (limit: 2200)
   Memory: 824.0K
   CGroup: /system.slice/mosquitto.service
           └─2154 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

 7月 16 09:22:18 raspberrypi systemd[1]: Starting Mosquitto MQTT v3.1/v3.1.1 Bro
 7月 16 09:22:19 raspberrypi systemd[1]: Started Mosquitto MQTT v3.1/v3.1.1 Brok
でBrokerの稼働状況を見ることが出来る。

clientについてはwindowsではBrokerと一緒にインストール出来たがラズパイでは別々にインストールする。
pi@raspberrypi:~ $ sudo apt-get install mosquitto-clients
subscriberの起動
pi@raspberrypi:~ $ mosquitto_sub -d -t orz
Client mosqsub|2557-raspberryp sending CONNECT
Client mosqsub|2557-raspberryp received CONNACK (0)
Client mosqsub|2557-raspberryp sending SUBSCRIBE (Mid: 1, Topic: orz, QoS: 0)
Client mosqsub|2557-raspberryp received SUBACK
Subscribed (mid: 1): 0
Client mosqsub|2557-raspberryp received PUBLISH (d0, q0, r0, m0, 'orz', ... (15 bytes))
こんにちは
別のターミナルを立ち上げてpublisherを起動して"こんにちは"を送信
pi@raspberrypi:~ $ mosquitto_pub -d -t orz -m "こんにちは"
Client mosqpub|2560-raspberryp sending CONNECT
Client mosqpub|2560-raspberryp received CONNACK (0)
Client mosqpub|2560-raspberryp sending PUBLISH (d0, q0, r0, m1, 'orz', ... (15 bytes))
Client mosqpub|2560-raspberryp sending DISCONNECT
subscriberの最下段にこんにちはが表示される。このことはwindowsと同じである。

③clientにmqttBoxを使用

 ①②の方法はクライアントとしてターミナル上でのコマンドラインを使用したが、GUIのソフトも存在する。
MqttBox DownLoad Page
からダウンロードしてMQTTBox-win.exeを実行することでインストールできる。
結果アイコンがディスクトップに現れる。 これをクリックすると


赤線の部分を環境に合わせて修正することで機能する。HOSTの部分は使用するBrokerのURLまたは内部にサーバーを配置する場合は、192.168.0.55などのIPアドレスを入力する。


左がpublisherで右がsubscriberである。publisherのpayloadの欄に記入したメッセージがsubscriberに伝わっている。

④ESP8266からの温度、湿度の伝送

 最後に実際のIotでの使用状態に近い形でESP8266で接続したセンサーDTH11で観測した温度、湿度を定期的に観測するとともにsubscriber側からの指示で随時観測データをESP8266側のシリアルモニターに表示する構成を試してみる。
 ESP8266側の配線は、以下の通りでDTH11の信号はESP8266のIO4に接続してある。


 これに書き込んだスケッチは、osoyoo社のページのものを拝借した。DTH11を接続したスケッチ
 Brokerはラズパイで作ったIPAdress:192.168.0.58のものを使っている。また、DTH11の信号は#define DHT11_PIN 4でIO4に指定している。
 トピックは制御側がOsoyooCommand、監視側がOsoyooDataである。



観測データが定期的に送られている。また、逆にsubscriberから"0"や"1"を送信することでESP8266t側のシリアルモニターに温度あるいは湿度が表示される。
real time temperature: 27.00 C ;real time Humidity: 85.00
Command is : [OsoyooCommandto show humidity!]
 Humidity is: 85.0%        ←----------------------

real time temperature: 27.00 C ;real time Humidity: 85.00
このことはESP8266側への制御が出来ていることであり、監視のみならず制御も容易に実現できることを示しており、WebServerを使ったものより柔軟性が高いように思われる。

また、データの監視には記録していくことが必要である。Pythonのsubscriberもあるようなのでこれを使えばファイルやデータベースなどに記録できそうである。今後挑戦してみたい。