Skip to content

通过互联网控制夜灯 - Wio Terminal

在本节课程中,您将订阅从 MQTT broker 发送到 Wio Terminal 的命令。

订阅命令

下一步是订阅从 MQTT broker 发送的命令,并对其作出响应。

任务

订阅命令。

  1. 在 VS Code 中打开夜灯项目。

  2. config.h 文件的底部添加以下代码,以定义命令的主题名称:

    cpp
    const string SERVER_COMMAND_TOPIC = ID + "/commands";

    SERVER_COMMAND_TOPIC 是设备将订阅以接收 LED 命令的主题。

  3. reconnectMQTTClient 函数的末尾添加以下代码行,以便在 MQTT 客户端重新连接时订阅命令主题:

    cpp
    client.subscribe(SERVER_COMMAND_TOPIC.c_str());
  4. reconnectMQTTClient 函数下方添加以下代码:

    cpp
    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 函数中添加以下代码:

    cpp
    client.setCallback(clientCallback);

    此代码将 clientCallback 设置为当从 MQTT broker 接收到消息时调用的回调函数。

    💁 clientCallback 处理程序会为所有订阅的主题调用。如果您稍后编写监听多个主题的代码,可以通过回调函数传递的 topic 参数获取消息发送的主题。

  6. 将代码上传到您的 Wio Terminal,并使用串口监视器查看发送到 MQTT broker 的光线强度数据。

  7. 调整您的物理或虚拟设备检测到的光线强度。您将在终端中看到接收到的消息和发送的命令。根据光线强度,您还会看到 LED 被打开或关闭。

💁 您可以在 code-commands/wio-terminal 文件夹中找到此代码。

😀 您已成功编写代码,使设备能够响应来自 MQTT broker 的命令。