# M06-C IoT 消息数据库变更 - 迁移版本:`2026062220` - 名称:`m06c_iot_messages` ## 新增 - `qipai_iot_commands`:13 位命令 ID、状态、请求/回包、发布/ACK/超时和失败原因。 - `qipai_iot_device_events`:原始/标准化消息、Topic、事件类型、payload 哈希、接收次数。 - `qipai_iot_dead_letters`:非法 Topic、未知设备和解析失败消息。 ## 幂等与回滚 - 设备事件按租户、设备、Topic 和 payload 哈希唯一;重复消息只增加计数。 - 死信按 Topic 和 payload 哈希唯一。 - down 迁移仅删除 M06-C 三张表,不影响设备资产和拓扑。 ## M06-C-R1 语义收口(2026-08-10) - 本阶段不新增表或迁移版本;沿用既有 JSON 与状态列修正协议语义。 - 未知厂商结果的事件写 `processing_status=PROTOCOL_ERROR`,原结果保留在 `raw_payload`,标准化结果写 `UNKNOWN_VENDOR_RESULT`,相关命令写 `FAILED/UNKNOWN_VENDOR_RESULT`,并新增协议死信和开放告警。 - 门锁密码/卡号请求和 `record.content` 在写入 `request_payload/raw_payload/normalized_payload/response_payload` 前哈希与脱敏。 - `AddDevice` 首 ACK 保持命令 `PUBLISHED`,携带 `subtype/subID` 的最终 ACK 才转 `ACKED` 并创建 701C/701G 拓扑。 - WSL MySQL 8.4.10 一次性数据库已验证上述语义及裸 `devicewill=close` 离线落库;完整迁移往返仍为 144 up、124 verify、140 down。 ## M06-E-R1 插座消息语义(2026-08-10) - 不新增迁移版本;`normalized_payload.payload` 新增 `switchOn/voltage/current/power/temperature/energy` 标准字段,计量值为规范十进制字符串。 - `raw_payload` 继续保存脱敏后的厂商原字段,不能再用它覆盖适配器生成的标准化 payload。 - `temp/temperature` 冲突写 `processing_status=PROTOCOL_ERROR`,同时写 `SOCKET_TEMPERATURE_CONFLICT` 告警和死信。 - `special.closeReason` 3-7 分别 upsert 五类保护告警;1-2 只落设备事件。 - `setReturnKey.old/new` 与 `returnFactory.password` 在命令持久化前哈希/脱敏,Wire 原值只存在下发内存中。