# 通过互联网控制夜灯 - Wio Terminal 在本节课程中,您将订阅从 MQTT broker 发送到 Wio Terminal 的命令。 ## 订阅命令 下一步是订阅从 MQTT broker 发送的命令,并对其作出响应。 ### 任务 订阅命令。 1. 在 VS Code 中打开夜灯项目。 1. 在 `config.h` 文件的底部添加以下代码,以定义命令的主题名称: ```cpp const string SERVER_COMMAND_TOPIC = ID + "/commands"; ``` `SERVER_COMMAND_TOPIC` 是设备将订阅以接收 LED 命令的主题。 1. 在 `reconnectMQTTClient` 函数的末尾添加以下代码行,以便在 MQTT 客户端重新连接时订阅命令主题: ```cpp client.subscribe(SERVER_COMMAND_TOPIC.c_str()); ``` 1. 在 `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(); bool led_on = obj["led_on"]; if (led_on) digitalWrite(D0, HIGH); else digitalWrite(D0, LOW); } ``` 此函数将作为回调,当 MQTT 客户端从服务器接收到消息时调用。 消息以无符号 8 位整数数组的形式接收,因此需要转换为字符数组才能作为文本处理。 消息包含一个 JSON 文档,并使用 ArduinoJson 库进行解码。读取 JSON 文档的 `led_on` 属性,根据其值决定是否打开或关闭 LED。 1. 在 `createMQTTClient` 函数中添加以下代码: ```cpp client.setCallback(clientCallback); ``` 此代码将 `clientCallback` 设置为当从 MQTT broker 接收到消息时调用的回调函数。 > 💁 `clientCallback` 处理程序会为所有订阅的主题调用。如果您稍后编写监听多个主题的代码,可以通过回调函数传递的 `topic` 参数获取消息发送的主题。 1. 将代码上传到您的 Wio Terminal,并使用串口监视器查看发送到 MQTT broker 的光线强度数据。 1. 调整您的物理或虚拟设备检测到的光线强度。您将在终端中看到接收到的消息和发送的命令。根据光线强度,您还会看到 LED 被打开或关闭。 > 💁 您可以在 [code-commands/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal) 文件夹中找到此代码。 😀 您已成功编写代码,使设备能够响应来自 MQTT broker 的命令。 **免责声明**: 本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。