メインコンテンツまでスキップ

インターネットを介してナイトライトを制御する - Wio Terminal

このレッスンのこの部分では、MQTTブローカーからWio Terminalに送信されるコマンドを購読します。

コマンドを購読する

次のステップは、MQTTブローカーから送信されるコマンドを購読し、それに応答することです。

タスク

コマンドを購読する。

  1. VS Codeでナイトライトプロジェクトを開きます。

  2. config.hファイルの末尾に次のコードを追加して、コマンドのトピック名を定義します:

    const string SERVER_COMMAND_TOPIC = ID + "/commands";

    SERVER_COMMAND_TOPICは、デバイスがLEDコマンドを受信するために購読するトピックです。

  3. MQTTクライアントが再接続されたときにコマンドトピックを購読するために、reconnectMQTTClient関数の末尾に次の行を追加します:

    client.subscribe(SERVER_COMMAND_TOPIC.c_str());
  4. reconnectMQTTClient関数の下に次のコードを追加します。

    void clientCallback(char *topic, uint8_t *payload, unsigned int length)
    {
    char buff[length + 1];
    for (int i = 0; i < length; i++)
    {
    buff[i] = (char)payload[i];
    }
    buff[length] = '\0';

    Serial.print("Message received:");
    Serial.println(buff);

    DynamicJsonDocument doc(1024);
    deserializeJson(doc, buff);
    JsonObject obj = doc.as<JsonObject>();

    bool led_on = obj["led_on"];

    if (led_on)
    digitalWrite(D0, HIGH);
    else
    digitalWrite(D0, LOW);
    }

    この関数は、MQTTクライアントがサーバーからメッセージを受信したときに呼び出すコールバックになります。

    メッセージは符号なし8ビット整数の配列として受信されるため、テキストとして扱うために文字配列に変換する必要があります。

    メッセージにはJSONドキュメントが含まれており、ArduinoJsonライブラリを使用してデコードされます。JSONドキュメントのled_onプロパティが読み取られ、その値に応じてLEDがオンまたはオフになります。

  5. createMQTTClient関数に次のコードを追加します:

    client.setCallback(clientCallback);

    このコードは、メッセージがMQTTブローカーから受信されたときに呼び出されるコールバックとしてclientCallbackを設定します。

    💁 clientCallbackハンドラーは、購読しているすべてのトピックに対して呼び出されます。後で複数のトピックをリッスンするコードを書く場合、コールバック関数に渡されるtopicパラメータからメッセージが送信されたトピックを取得できます。

  6. コードをWio Terminalにアップロードし、シリアルモニターを使用してMQTTブローカーに送信される光レベルを確認します。

  7. 物理デバイスまたは仮想デバイスで検出される光レベルを調整します。ターミナルでメッセージが受信され、コマンドが送信されるのがわかります。また、光レベルに応じてLEDがオンおよびオフになるのも確認できます。

💁 このコードはcode-commands/wio-terminalフォルダーにあります。

😀 デバイスがMQTTブローカーからのコマンドに応答するようにコード化することに成功しました。