MQTT是本项目实现设备与云端/Web端双向同步的核心。相关代码封装在 obj/MQTT/MQTT.c 中。
使用的知识点为MQTT通信
1. 核心库
- 项目使用业界主流的
libmosquitto作为C语言的MQTT客户端库。
2. 异步回调机制
- 非阻塞设计: 通过调用
mosquitto_loop_start(),MQTT客户端在一个独立的后台线程中运行其网络循环。这确保了MQTT的连接、消息收发和心跳维持都不会阻塞UI主线程。 - 事件回调: 客户端的工作模式是事件驱动的。代码中定义了一系列回调函数:
on_connect: 当成功连接到Broker后被调用。在此函数中,会集中订阅所有需要监听的主题(如灯光控制MQTT_SUB_LIGHT_TOPIC)。on_message: 当任何已订阅的主题收到新消息时被调用。这是远程控制逻辑的核心入口。on_publish: 当一条消息成功发布出去后被调用,用于确认。
3. 消息协议与分发
- JSON 负载: 与服务端/Web端之间的通信数据格式为JSON字符串。
- 主题分发: 在
on_message回调函数中,程序通过strcmp(msg->topic, ...)来判断消息来自哪个主题,然后将消息分发给不同的处理逻辑。 - 指令解析: 对于收到的JSON字符串,程序使用
cJSON库进行解析,提取出 “command”, “led”, “state” 等字段,并根据这些字段的值执行相应的操作,如调用lighting_set_from_mqtt()控制灯光。
4. 状态同步
- 该模块不仅接收指令,也负责响应查询。例如,当收到 “list” 命令时,它会从
state_store模块加载当前所有设备的状态,然后构建一个JSON响应并将其发布回相应的主题,从而让Web端获取到设备的最新状态。