IoT を使ってみる(その4:AWS IoT MQTT PUB/SUB編)

| 3 min read
Author: shuichi-takatsu shuichi-takatsuの画像

前々回(AWS IoT モノの準備編)前回(AWS IoT プログラム編)で、AWS IoTとIoTデバイスを接続するための準備ができました。
今回は双方向にデータ通信をさせて、IoT接続が確立していることを確認していきましょう。

AWS IoT MQTTテストクライアント

#

初回のチュートリアルでも使用した「AWS IoT MQTTテストクライアント」を使用します。

前回作成したプログラムを書き込んだIoTデバイス(ESP32 LOLIN D32)をPCのUSBポートに接続します。
仮想COMポートが何番に割り当てられているかは個々の環境によって異なると思いますが、私の環境ではCOM7に割り当てられていました。

サブスクリプション(IoTデバイス → AWS IoT)

#

IoTデバイス上で動作しているプログラムにおいて、パブリッシング(送信)を担当するコードは以下の部分です。

void publishMessage()
{
  StaticJsonDocument<200> doc;
  doc["time"] = millis();
  doc["sensor_a0"] = analogRead(0);
  char jsonBuffer[512];
  serializeJson(doc, jsonBuffer); // print to client

  client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
}
  • time: 時刻
  • sensor_a0: アナログ入力

がJSONフォーマットに変換されて AWS_IOT_PUBLISH_TOPIC で定義されたトピック(="esp32/pub")に送出されます。

データを受信してみましょう。
MQTTテストクライアントに以下のように設定します。

「トピックをサブスクライブする」タブを選択し、「トピックのフィルター」に「esp32/pub」を設定し、「サブスクライブ」ボタンを押します。
サブスクリプションのリストに「esp32/pub」が登録されます。
(※サブスクリプションするのに「esp32/pub」を設定するのは、IoTデバイス側が”esp32/pub”トピックにメッセージを送出するので、このトピックでサブスクライブする必要があるためです)

IoTデバイス(ESP32 LOLIN D32)が正常に動いていれば(Lチカで動作の確認ができます)、約1秒間隔で以下のようなログがページの右側に表示されるのが確認できます。

これでIoTデバイス側からAWS IoT側にMQTTでメッセージが送信されていることが確認できました。

パブリッシング(AWS IoT → IoTデバイス)

#

次にAWS IoT(クラウド)側からIoTデバイスにメッセージを送出してみます。

IoTデバイスはデータを受信したらCOMポートに受信データを出力するようにしています。
出力フォーマットは
"incoming: " + <トピック名> + " - " + <送信データ>
です。

void messageHandler(String &topic, String &payload) {
  Serial.println("incoming: " + topic + " - " + payload);

//  StaticJsonDocument<200> doc;
//  deserializeJson(doc, payload);
//  const char* message = doc["message"];
}

受信データを確認するために、Arduino IDEの「シリアルモニタ」を起動します。

シリアルモニタのダイアログが表示されました。
ダイアログの上部に今回の監視対象であるCOMポート番号が表示されていることを確認します。

次はAWS IoT側の準備をします。
「トピックを公開する」タブを以下のように設定します。

  • トピック名: esp32/sub
  • メッセージのペイロード: 任意の文字列

(※パブリッシングするのに「esp32/sub」を設定するのは、IoTデバイス側が”esp32/sub”トピックでサブスクライブしているので、このトピックにパブリッシングする必要があるためです)

「発行」ボタンを押します。
AWS IoTクラウドからメッセージが送出され、IoTデバイスがメッセージを受信すると、シリアルモニタに受信したメッセージが出力されます。

これでAWS IoT側からIoTデバイス側にMQTTでメッセージが送信されていることが確認できました。

まとめ

#

AWS IoTとIoTデバイス間で、MQTTを用いてPUB/SUBメッセージ通信をさせることができました。
MQTTは多対多のメッセージを効率よくやり取りでき、IoT時代のメッセージ通信と言われています。
今後もIoTに関する話題をお届けしていこうと思います。

過去記事インデックス:

豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. 基本から理解するJWTとJWT認証の仕組み(2022-12-08)
  2. 直感が理性に大反抗!「モンティ・ホール問題」(2022-07-04)
  3. Nuxt3入門(第4回) - Nuxtのルーティングを理解する(2022-10-09)
  4. Nuxt3入門(第8回) - Nuxt3のuseStateでコンポーネント間で状態を共有する(2022-10-28)
  5. Podman Desktopがv1.0になったのでwindows版を試してみたところ、気付いたらv1.1に上がるくらいに機能豊富だった話(2023-06-09)
  6. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する(2022-09-25)
  7. VS Code で .NET MAUI の開発環境を構築する(macOS/iOS)(2023-08-14)
  8. Pytestを使ってみる(その2:VSCode拡張機能編)(2023-03-05)
  9. GitHub Actions - 構成変数(環境変数)が外部設定できるようになったので用途を整理する(2023-01-16)
  10. 統計学で避けて通れない自由度の話(2022-06-20)