开发日志
智能手表项目开发日志 005:用 MQTT 把设备状态送到华为云
记录 RK2206 设备接入华为云 IoTDA 的过程:完成属性上报、命令订阅、JSON 解析、设备反控和断线重连。
云端联调,先解决连接再解决业务
设备端要做远程控制,第一步不是写控制按钮,而是让网络连接稳定地建立起来。iot_thread 负责配置 Wi-Fi STA 模式、启动网络和初始化 MQTT;mqtt_init() 负责连接华为云 IoTDA、设置客户端参数、订阅设备命令主题。连接失败时,设备会断开网络并重新进入连接流程。
这部分代码的价值在于把网络状态显式化。业务线程通过 mqtt_is_connected() 判断是否可以上报,LCD 也会根据连接状态显示网络图标。网络不可用时,设备仍然可以本地采集和显示,不会因为云端暂时不可达而完全失去功能。
属性上报使用统一 JSON 结构
设备端把 e_iot_data 转换为华为云设备属性格式:外层是 services 数组,服务 ID 为 smartwatchsystem,内部 properties 包含时间、温度、步数、运动状态、门禁状态以及报警、久坐监测和语音助手开关。
温度和步数当前以字符串形式放入 JSON,运动和门禁状态使用 0、1、2 表示不同状态,开关则转换为 ON 或 OFF。这种格式和手机端展示比较直观,但如果后续要做统计分析,温度、步数和时间更适合使用数值类型,并在产品协议中明确单位和时区。
云端命令要有响应,也要有本地事件
设备订阅命令主题后,mqtt_message_arrived() 会先读取请求 ID,向响应主题发布成功结果,再解析命令正文。代码目前支持运动状态、门禁状态、温度报警、久坐监测、语音助手和时间同步等控制命令。
命令解析完成后不会直接操作硬件,而是转换成内部事件。例如运动状态命令最终交给业务层修改状态并刷新 LCD,门禁命令则会进一步触发 NFC 初始化或释放。这种“云端协议 → 内部事件 → 业务处理”的转换,让云端协议和设备实现之间保持了一层隔离。
端—边—云链路的下一步
项目资料中的架构图还规划了 AMQP 数据转发、HTTP 主动请求和 WebSocket 实时推送:手机端可以通过 HTTP 获取设备信息或下发请求,通过 WebSocket 接收实时变化,云端则通过 AMQP 把设备侧 MQTT 数据转发给应用侧。
当前南向源码已经验证了 MQTT 设备接入和反控闭环,AMQP/HTTP/WebSocket 属于平台和应用侧的集成层。把这几层区分清楚很重要,否则容易把“设备已经能上报 MQTT”误写成“手机端已经完成全部实时通信”。
阶段结果
云端阶段完成了设备属性上报、命令订阅、命令响应、状态更新和断线重连,设备可以被远程查看和控制。下一阶段将围绕鸿蒙应用完成页面、数据模型和真实通信接口的整合,并重点验证端云状态是否能够双向同步。