You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/zh/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md

3.4 KiB

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

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

订阅命令

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

任务

订阅命令。

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

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

    const string SERVER_COMMAND_TOPIC = ID + "/commands";
    

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

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

    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);
    

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

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

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

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

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

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

免责声明
本文档使用AI翻译服务Co-op Translator进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。