通过互联网控制你的夜灯 - 虚拟物联网硬件和树莓派
在本课的这一部分,你将订阅从 MQTT broker 发送到你的树莓派或虚拟物联网设备的命令。
订阅命令
下一步是订阅从 MQTT broker 发送的命令并对其作出响应。
任务
订阅命令。
在 VS Code 中打开夜灯项目。
如果你使用的是虚拟物联网设备,请确保终端正在运行虚拟环境。如果你使用的是树莓派,则无需使用虚拟环境。
在
client_telemetry_topic定义之后添加以下代码:pythonserver_command_topic = id + '/commands'server_command_topic是设备订阅以接收 LED 命令的 MQTT 主题。在主循环的上方、
mqtt_client.loop_start()行之后添加以下代码:pythondef handle_command(client, userdata, message): payload = json.loads(message.payload.decode()) print("Message received:", payload) if payload['led_on']: led.on() else: led.off() mqtt_client.subscribe(server_command_topic) mqtt_client.on_message = handle_command这段代码定义了一个函数
handle_command,它将消息读取为 JSON 文档,并查找led_on属性的值。如果该值为True,则打开 LED,否则关闭 LED。MQTT 客户端会订阅服务器发送消息的主题,并设置在接收到消息时调用
handle_command函数。💁
on_message处理器会被所有订阅的主题调用。如果你之后编写代码监听多个主题,可以从传递给处理器函数的message对象中获取消息发送的主题。按照上一部分作业运行代码的方式运行代码。如果你使用的是虚拟物联网设备,请确保 CounterFit 应用正在运行,并且光传感器和 LED 已在正确的引脚上创建。
调整你的物理或虚拟设备检测到的光线水平。接收到的消息和发送的命令会写入终端。LED 也会根据光线水平打开或关闭。
💁 你可以在 code-commands/virtual-device 文件夹或 code-commands/pi 文件夹中找到这段代码。
😀 恭喜!你已经成功编写了设备代码,使其能够响应来自 MQTT broker 的命令。