8.4 IoT通信とMQTT

このプロジェクトは、IoT(モノのインターネット)分野で人気のある通信プロトコルであるMQTTを活用することに焦点を当てています。MQTTは、IoTデバイスがトピックを通じてデータを交換するパブリッシュ/サブスクライブモデルを可能にします。

このプロジェクトでは、LED、ボタン、サーミスタを含む回路を構築することでMQTTの実装を探求します。ESP32-WROOM-32Eマイクロコントローラーは、Wi-Fiへの接続を確立し、MQTTブローカーと通信するために使用されます。コードにより、マイクロコントローラーは特定のトピックをサブスクライブし、メッセージを受信し、受信した情報に基づいてLEDを制御することができます。さらに、このプロジェクトは、ボタンが押されたときにサーミスタからの温度データを指定されたトピックに公開することを示しています。

必要な部品

このプロジェクトでは、以下のコンポーネントが必要です。

一式を購入するのが非常に便利です。リンクはこちらです:

名前

このキットのアイテム

リンク

ESP32 Starter Kit

320+

ESP32 Starter Kit

以下のリンクから個別に購入することもできます。

コンポーネントの紹介

購入リンク

ESP32 WROOM 32E

BUY

ESP32カメラ拡張ボード

-

ブレッドボード

BUY

ジャンパーワイヤ

BUY

抵抗器

BUY

LED

BUY

ボタン

BUY

サーミスタ

BUY

コードアップロード

  1. 回路を組み立てます。

    注釈

    Wi-Fiへの接続を確立する際には、36, 39, 34, 35, 32, 33ピンのみがアナログ読取りに使用できます。サーミスタがこれら指定されたピンに接続されていることを確認してください。

    ../../_images/iot_4_matt_bb.png
  2. 次に、USBケーブルを使ってESP32-WROOM-32Eをコンピュータに接続します。

    ../../_images/plugin_esp32.png
  3. コードを開きます。

    • esp32-starter-kit-main\c\codes\iot_4_mqtt ディレクトリにある iot_4_mqtt.ino ファイルを開くか、Arduino IDEにコードをコピーします。

    • ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。

    • "Unknown COMxx"が常に表示されますか?

    • ここでは PubSubClient ライブラリが使用されており、 Library Manager からインストールできます。

      ../../_images/mqtt_lib.png
  4. 次の行を見つけて、あなたの <SSID><PASSWORD> で修正してください。

    // Replace the next variables with your SSID/Password combination
    const char* ssid = "<SSID>";
    const char* password = "<PASSWORD>";
    
  5. 次の行を見つけて、あなたの unique_identifier で修正してください。あなたの unique_identifier が本当にユニークであることを保証してください。同一のIDを持つデバイスが同じMQTTブローカーにログインしようとすると、ログインに失敗する可能性があります。

    // Add your MQTT Broker address, example:
    const char* mqtt_server = "broker.hivemq.com";
    const char* unique_identifier = "sunfounder-client-sdgvsda";
    

トピックのサブスクリプション

  1. 他の参加者からのメッセージの干渉を避けるために、目立たない、または一般的でない文字列として設定できます。現在のトピック SF/LED を、あなたの望むトピック名に単純に置き換えてください。

    注釈

    トピックは、あなたが望むどんな文字にも設定できます。同じトピックにサブスクライブしたMQTTデバイスは、同じメッセージを受け取ることができます。また、複数のトピックに同時にサブスクライブすることもできます。

    void reconnect() {
        // Loop until we're reconnected
        while (!client.connected()) {
            Serial.print("Attempting MQTT connection...");
            // Attempt to connect
            if (client.connect(unique_identifier)) {
                Serial.println("connected");
                // Subscribe
                client.subscribe("SF/LED");
            } else {
                Serial.print("failed, rc=");
                Serial.print(client.state());
                Serial.println(" try again in 5 seconds");
                // Wait 5 seconds before retrying
                delay(5000);
            }
        }
    }
    
  2. サブスクライブしているトピックに応答する機能を変更します。提供されたコードでは、トピック SF/LED でメッセージを受信すると、 on または off かどうかを確認します。受信したメッセージに応じて、LEDのオン/オフ状態を制御する出力状態を変更します。

    注釈

    サブスクライブしている任意のトピックに対して変更できますし、複数のトピックに対応するために複数のif文を書くこともできます。

    void callback(char* topic, byte* message, unsigned int length) {
        Serial.print("Message arrived on topic: ");
        Serial.print(topic);
        Serial.print(". Message: ");
        String messageTemp;
    
        for (int i = 0; i < length; i++) {
            Serial.print((char)message[i]);
            messageTemp += (char)message[i];
        }
        Serial.println();
    
        // If a message is received on the topic "SF/LED", you check if the message is either "on" or "off".
        // Changes the output state according to the message
        if (String(topic) == "SF/LED") {
            Serial.print("Changing state to ");
            if (messageTemp == "on") {
                Serial.println("on");
                digitalWrite(ledPin, HIGH);
            } else if (messageTemp == "off") {
                Serial.println("off");
                digitalWrite(ledPin, LOW);
            }
        }
    }
    
  3. 正しいボード(ESP32 Dev Module)とポートを選択した後、 アップロード ボタンをクリックします。

  4. シリアルモニターを開いて、以下の情報が表示されれば、MQTTサーバーへの接続が成功したことを意味します。

    WiFi connected
    IP address:
    192.168.18.77
    Attempting MQTT connection...connected
    

HiveMQを通じたメッセージ公開

HiveMQは、MQTTブローカーとして機能するメッセージングプラットフォームで、IoTデバイスへの迅速で効率的かつ信頼性の高いデータ転送を促進します。

私たちのコードは、HiveMQが提供するMQTTブローカーを具体的に利用しています。コード内には、HiveMQのMQTTブローカーのアドレスが次のように含まれています:

// Add your MQTT Broker address, example:
const char* mqtt_server = "broker.hivemq.com";
  1. 現在、Webブラウザで HiveMQ Web Client を開きます。

  2. クライアントをデフォルトの公開プロキシに接続します。

    ../../_images/sp230512_092258.png
  3. サブスクライブしたトピックでメッセージを公開します。このプロジェクトでは、 on または off を公開してLEDを制御できます。

    ../../_images/sp230512_140234.png

MQTTへのメッセージ公開

コードを使用してトピックに情報を公開することもできます。このデモでは、ボタンを押したときにサーミスタで測定した温度をトピックに送信する機能をコーディングしました。

  1. Add New Topic Subscription をクリックします。

    ../../_images/sp230512_092341.png
  2. フォローしたいトピックを入力して、 サブスクライブ をクリックします。コードでは、温度情報をトピック SF/TEMP に送信しています。

    void loop() {
        if (!client.connected()) {
            reconnect();
        }
        client.loop();
    
        // if the button pressed, publish the temperature to topic "SF/TEMP"
        if (digitalRead(buttonPin)) {
                long now = millis();
                if (now - lastMsg > 5000) {
                lastMsg = now;
                char tempString[8];
                dtostrf(thermistor(), 1, 2, tempString);
                client.publish("SF/TEMP", tempString);
            }
        }
    }
    
  3. これで、HiveMQでこのトピックを監視することができ、公開した情報を見ることができます。

    ../../_images/sp230512_154342.png