Web ブラウザから IoT デバイスの監視と制御
MQTT Mosquitto ブラウザ Web ソケット WebSocket IoTデバイス 監視・制御 SSL/TLS
背景
MQTT プロトコルは IoT 機器の監視・制御に最適な通信方式です。 Mosquitto や EMQX社 から無料で利用できる MQTT Broker が提供されていて手軽に利用できます。 しかし予期せぬサーバーの停止により IoT 機器の監視・制御に不都合をきたしたり、相乗りサーバーのためどうしてもセキュリティに対する不安も残ります。
これらの課題を解決するために VPS サーバーにセキュリティ対策も行った MQTT Broker をインストールして IoT システムを構成しました。 特に Web ブラウザと MQTT Broker 間の MQTT over WebSockets with TLS に多くの試行錯誤をともなったので整理して記録を残します。
ゴール

・VPS サーバーに MQTT Broker インストール
・TLS(SSL) によるセキュリティ対応
・IoT デバイス (C++) と MQTT Broker 間は MQTT over TLS (mqtts://) 通信
・Web ブラウザ (HTML, Java Script, CSS) と MQTT Broker 間 MQTT over WebSockets with TLS (wss://) 通信
本章では、これまでの成果を用いてシステムを構成することにより Web ブラウザから IoT デバイスの監視と制御ができることを確認します。
前提条件
・Mosquitto (バージョン 2.0.11) インストール済み
・VPSサーバー Linux OS Debian (バージョン 6.1.153-1)
・IoT デバイス ESP32-DevKitC
・開発プラットフォーム Visual Studio Code (バージョン:1.105.0)
・拡張機能 PlatformIO IDE for VSCode (バージョン 3.3.4)
・開発言語 Linux , C++, HTML, Java Script, CSS
・通信プロトコル MQTT over TLS (mqtts://), MQTT over WebSockets with TLS (wss://)
・Windows 11 (バージョン Pro 24H2)
・これまでの投稿すべてについて動作確認ができていること。
(1)Mosquitto を VPS にインストール
(2)Web ブラウザと IoT 間 動作エミュレート
(3)Web ブラウザ ソフトウエアコード
(4)IoT デバイスハードウエア
(5)IoT デバイス ソフトウエアコード
システム構成
システムの構成は上記 図 1 を参照します。 構成要素の詳細は下記に示す投稿を参照します。
MQTT Broker
(1)Mosquitto を VPS にインストール
Web ブラウザ
(3)Web ブラウザ ソフトウエアコード
IoT デバイス
(4)IoT デバイスハードウエア
(5)IoT デバイス ソフトウエアコード
データフォーマット
このシステムでは JSON 形式の データフォーマットを使用します。( 図 2 )

(a)時刻( 23 桁)
フォーマットは ISO8601 に準じています。
(b)クライアント情報( 7 桁)
”BROWSER”・・・Web ブラウザ
”ESP32__”・・・IoT デバイス
(c)IoT デバイス IO19 端子の状態( 4 桁)
”HIGH”・・・IO19 端子=HIGH
”LOW_”・・・IO19 端子=LOW
”NULL”・・・Web ブラウザから送信する場合は “NULL” を設定しています。
(d)Web ブラウザからの制御信号( 4 桁)
”ON__”・・・ON ボタン押下信号
”OFF_”・・・OFF ボタン押下信号
”NULL”・・・IoT デバイスから送信する場合は “NULL” を設定しています。
動作確認手順
1. Web ブラウザ立ち上げ
・(3)Web ブラウザ ソフトウエアコード で作成した HTML ファイルを開きます。(図 3 )
例)https://ドメイン名/OOO.html

2. IoT デバイス 立ち上げ
・PC で Visual Studio Code を立ち上げます。
・ (5)IoT デバイス ソフトウエアコード で作成したコードを開きます。
・USB ケーブルを使って IoT デバイスを PC に接続します。(図 4 )

・Visual Studio Code > アリさんマーク > PROJECT TASKS > esp32dev > Monitor
・C++ が実行されて Visual Studio Code 画面下部にターミナル出力が表示されます。(図 5)
・Wi-Fi 接続確立、MQTT 接続確立、subscribe 開始のメッセージが表示されます。
・publish selected at loop・・・C++起動時自動的に publish したメッセージが表示されます。
・Message received on topic: MQTT topic・・・publish のループバックが表示されます。
図 5
・Web ブラウザには subscribed 窓に IoT デバイスからのメッセージが表示されます。(図 6)
・”client”:ESP32__” より送信クライアントは ESP32__(IoT デバイス)だとわかります。
・”state”:”HIGH” より IoT デバイス IO19 端子の状態は HIGH であることがわかります。

3. Web ブラウザ ON ボタンクリック
・published 窓に送信したメッセージ、subscribed 窓にそのエコーバックが表示されます。
・送信クライアントは Web ブラウザであることが “client”:”BROWSER” からわかります。(図 7)
・送信した制御信号は ON であることが “controll”:”ON__” からわかります。

IoT デバイスは赤の LED が点灯します。( 図 8 )

・ターミナル出力には受信したメッセージが表示されます。( 図 9 )
・”client”:”BROWSER” より Web ブラウザからのメッセージであることがわかります。
・”control”:”ON__” より制御信号が ON であることがわかります。
図 9
4. Web ブラウザ OFF ボタンクリック
・published 窓に送信したメッセージ、subscribed 窓にそのエコーバックが表示されます。
・送信クライアントは Webブラウザであることが “client”:”BROWSER”からわかります。(図 10)
・送信した制御信号は OFF であることが “controll”:”OFF_” からわかります。

IoT デバイスは赤の LED が消灯して緑の LED が点灯します。( 図 11 )

・ターミナル出力には受信したメッセージが表示されます。( 図 12 )
・”client”:”BROWSER” より Web ブラウザ からのメッセージであることがわかります。
・”control”:”OFF_” より制御信号が OFF であることがわかります。
図 12
5. IoT デバイス入力端子 IO19 HIGH → LOW
・IoT デバイス IO19 端子(白のリード線)を HIGH から LOW へ接続を変更します。(図 13 )

・ターミナル出力には送信したメッセージとエコーバックのメッセージが表示されます。(図 14 )
・”client”:”ESP32__” よりクライアントは ESP32__(IoT デバイス)だとわかります。
・ “state”:”LOW_” より IO19 端子の状態が LOW に変化したことがわかります。
図 14
・ブラウザの subscribed 窓にメッセージが表示されます。(図 15 )
・”client”:”ESP32__” より IoT デバイスから届いたメッセージであることがわかります。
・”state”:”LOW_” より IoT デバイス IO19 端子が LOW に変化したことがわかります。

6. IoT デバイス入力端子 IO19 LOW → HIGH
・IoT デバイスの IO19 端子(白のリード線)を LOW から HIGH へ接続を変更します。( 図 16)

・ターミナル出力には送信したメッセージとエコーバックのメッセージが表示されます。(図 17)
・”client”:”ESP32__” よりクライアントは ESP32__(IoT デバイス)だとわかります。
・ “state”:”HIGH” より IO19 端子の状態が HIGH に変化したことがわかります。
図 17
・ブラウザの subscribed 窓にメッセージが表示されます。(図 18 )
・”client”:”ESP32__” より IoT デバイスから届いたメッセージであることがわかります。
・”state”:”HIGH” より IoT デバイス IO19 端子が HIGH に変化したことがわかります。

以上、Web ブラウザから IoT デバイスの監視と制御ができることが確認できました。
MQTT 用語集
MQTT(Message Queuing Telemetry Transport)
IoTデバイス向けの軽量なパブリッシュ/サブスクライブ型通信プロトコルです。
- 基本的な登場人物
Broker(ブローカー)
メッセージの仲介役となるサーバー。送信者から届いたメッセージを、適切な受信者へ振り分けます。
Client(クライアント)
ブローカーに接続するデバイスやアプリ。送信側(Publisher)と受信側(Subscriber)の両方になり得ます。
Publisher(パブリッシャー)
メッセージを送信する側のクライアント。
Subscriber(サブスクライバー)
メッセージを受信するために、特定のトピックを購読(登録)する側のクライアント。 - メッセージ通信の概念
Topic(トピック)
メッセージを分類するためのパス(例:home/living/sensor)。受信側はこのトピックを指定して購読します。
Payload(ペイロード)
メッセージの実データ部分。中身はテキストやバイナリなど任意です。
Publish(パブリッシュ)
クライアントが特定のトピックに対してメッセージを送信すること。
Subscribe(サブスクライブ)
クライアントが特定のトピックを受け取れるようにブローカーに登録すること。 - 品質と信頼性の設定
QoS(Quality of Service)
メッセージの到達保証レベルです。
QoS 0 (At most once)
最高1回。届かなくても再送せず、最も軽量。
QoS 1 (At least once)
最低1回。必ず届くが、重複する可能性がある。
QoS 2 (Exactly once)
正確に1回。重複なく確実に届ける、最も信頼性が高い。
Keep Alive(キープアライブ)
クライアントとブローカーの接続が維持されているか確認するための定期的な信号。
LWT(Last Will and Testament / 遺言)
クライアントが予期せず切断された際、ブローカーが代わりに他者へ通知するメッセージ。
Google 検索結果を引用させていただきました。
リンク
Mosquitto で MQTT 双方向通信
(1)Mosquitto を VPS にインストール
(2)Web ブラウザと IoT 間 動作エミュレート
(3)Web ブラウザ ソフトウエアコード
(4)IoT デバイスハードウエア
(5)IoT デバイス ソフトウエアコード
(6)システム全体動作確認
(YI) [完]
コメント