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端获取到设备的最新状态。