# IoT 设备注册与 MQTT 消息规范

基于 `软件系统说明.docx` 整理。本文档用于固定当前已知的 IoT 与 MQTT 事实，并列出设备接入、消息定义和云端处理前必须补齐的规格项。

本文档不虚构未被文档确认的 topic、payload 或接入流程。

## 已确认事实

- 设备接入平台：`Tencent Cloud IoT Hub`
- 设备通过 `MQTT over TLS` 连接 IoT Hub
- 已知上报主题：`$iot/{product_id}/{device_name}/telemetry`
- 已知事件主题：`$iot/{product_id}/{device_name}/event`
- 云端业务组件包含：`SCF`、`MySQL`、`Redis`、`CLS`、`CMQ`
- 护理记录存在异步写入路径
- 云函数职责中包含：设备注册、动态获取 `DeviceSecret`

## 已知接入边界

从当前文档可确认以下边界：

- 设备端不是直接写业务数据库，而是先接入 IoT Hub
- 云端至少存在一条设备消息 -> 云端处理 -> 数据落库的链路
- 设备身份认证依赖 `DeviceSecret`
- 系统同时存在实时设备通信和异步消息处理

## 设备接入流程的最小骨架

当前文档没有给出完整时序，但从已知信息可整理出一条最小流程骨架：

1. 设备具备 `product_id` 和 `device_name`
2. 设备获取或持有 `DeviceSecret`
3. 设备通过 `MQTT over TLS` 连接 IoT Hub
4. 设备向指定 topic 上报 telemetry 和 event
5. 云端处理消息并执行日志、异步、入库等后续动作

## 待补齐的设备注册流程

当前最大缺口是 `DeviceSecret` 和设备注册流程，至少需要明确：

- 设备是在生产阶段预注册，还是首次使用时动态注册
- `DeviceSecret` 是一次性签发还是可轮换
- `DeviceSecret` 由谁调用云函数获取：生产工具、设备端、小程序端，还是后台系统
- 设备首次上线是否需要激活
- 设备注册与用户绑定是否是两个独立阶段
- 设备换绑、禁用、报废时如何处理 IoT 身份

## MQTT topic 已知信息

### 遥测主题

- Topic：`$iot/{product_id}/{device_name}/telemetry`
- 作用：设备业务数据上报

当前缺失：

- payload 结构
- 上报频率
- 是否包含治疗过程数据
- 是否包含传感器原始数据

### 事件主题

- Topic：`$iot/{product_id}/{device_name}/event`
- 作用：设备事件上报

当前缺失：

- 事件类型枚举
- 事件触发条件
- 事件 payload
- 错误事件与普通事件的区分

## 必须补齐的消息规范

### 1. Telemetry 消息

至少需要确认：

- 消息体格式：JSON、二进制或其他格式
- 核心字段
- 时间戳字段
- 设备状态字段
- 治疗相关字段
- 是否包含批量数据
- 是否需要签名或序列号

### 2. Event 消息

至少需要确认：

- 事件类型枚举
- 事件等级
- 事件时间
- 事件附加上下文
- 是否需要重试

### 3. 下行控制消息

当前文档没有明确写出下行 topic，但若系统需要远程控制或同步状态，必须明确：

- 是否存在云端 -> 设备的下发 topic
- 是否存在应答 topic
- 远程指令的触发方：小程序、后台、云端任务
- 指令时效和超时规则

## 消息处理链路待确认

当前只知道使用 `CMQ` 异步处理，至少需要明确：

- IoT Hub 消息如何进入云函数或消息队列
- 哪些消息同步处理，哪些消息异步处理
- 护理记录异步写入的触发条件
- 失败重试策略
- 死信消息处理策略
- 日志打点字段

## 建议补充的消息模板

后续可以按以下模板补齐实际 payload。

### Telemetry 模板

| 字段 | 类型 | 是否必填 | 说明 |
| --- | --- | --- | --- |
| 待定义 | 待定义 | 待定义 | 待定义 |

### Event 模板

| 字段 | 类型 | 是否必填 | 说明 |
| --- | --- | --- | --- |
| 待定义 | 待定义 | 待定义 | 待定义 |

## 设备状态建议先澄清的枚举

后续设计时建议先统一这些状态的定义：

- 未注册
- 已注册未激活
- 已激活未绑定
- 已绑定
- 在线
- 离线
- 禁用
- 故障

## 待确认问题

- `DeviceSecret` 是否通过云函数动态返回给设备
- 小程序在设备注册链路中扮演什么角色
- 设备是否需要主动上报固件版本、硬件版本、电量、错误状态
- `telemetry` 和 `event` 的边界如何划分
- 后台是否需要通过云端下发控制指令

## 当前结论

当前说明已足够确定 IoT 接入方式和两个基础 MQTT topic，但远不足以支持设备接入开发。最先要补的是设备注册流程、`DeviceSecret` 生命周期、payload 结构和消息处理链路。
