fix(vd960DBN): 消灭 data_json[1024] 中间缓冲, 防 BSS 重叠致 MQTT 上报 _raw 异常

- root cause: data_json[1024] + payload[1400] BSS 合计 2424B,
  叠加 iot_mqtt_srv.c 其他缓冲 (~9KB total), 在 48KB RAM 上
  与 mqttBuf[1024] 重叠, event_report 的 MQTT 二进制
  泄漏到 loop_data payload

- fix: 直接在 payload 构建完整 JSON, 省 1024B BSS
- defense: coil_count > 4 硬限, 防 0xC0 坏帧溢出
- JSON 输出格式不变

- also: set_response_tran_to_notify 加返回值
- also: uart_srv BLE 通知逻辑重构
This commit is contained in:
wangfq
2026-07-23 09:26:18 +08:00
parent 95a1d2b5d2
commit e11a80c859
4 changed files with 58 additions and 23 deletions
+34
View File
@@ -485,9 +485,43 @@ uint16_t pkt_id = (req_qos > 0) ? ++s_mqtt_pkt_id : 0;
---
---
## 2026-07-23 — loop_data JSON 构建优化: 消灭 data_json 中间缓冲 + coil_count 硬限
### 背景 / 问题
现场 DC045A49718F 出现 MQTT 上报异常: 平台收到 `_raw` 消息, hex 解码后发现
loop_data JSON 中间嵌入了完整的 MQTT PUBLISH 二进制帧 (event_report 的封包)。
**根因**: `iot_mqtt_publish_sensor()``static char data_json[1024]`
`static char payload[1400]` 合计 2424B BSS, 叠加同文件其他大缓冲 (~9KB total),
在 CH32V208 48KB RAM 中可能导致链接器将 `data_json`/`payload``mqttBuf[1024]`
分配到重叠地址。
**污染路径**:
1. `iot_evt_process()``mqtt_publish()``MQTTSerialize_publish(mqttBuf,...)` 写入 MQTT 二进制到 mqttBuf
2. 因 BSS 重叠, `data_json` 也被写入相同内容
3. `snprintf(data_json, ...)` 覆写前 ~427B 为通道 JSON, 尾部残留 MQTT 二进制
4. `snprintf(payload, ..., "%s", data_json)``%s` 将残留二进制也拷进 payload
5. `mqtt_publish(topic, payload, 0)` → 发出污染后的 payload
### 修复
| 改动 | 说明 |
|------|------|
| 消灭 `data_json[1024]` | 直接在 `payload[1400]` 构建完整 JSON, 省 1024B BSS |
| 消除 `%s` 拷贝 | 不再从中间缓冲格式化到 payload, 杜绝尾部二进制残留路径 |
| `coil_count` 硬限 | `if (coil_n > 4) coil_n = 4` — 防 0xC0 坏帧致 snprintf 循环溢出 |
| JSON 构建顺序调整 | 先写包装头 `{"msg_id":...,"data":{"channels":[`, 再追加通道, 最后 `]}}` |
**BSS 节省**: 1024 bytes
**协议兼容**: JSON 输出格式不变 (`{"msg_id":N,"cmd":"loop_data","ts":T,"data":{"channels":[...]}}`)
## 修订记录
| 版本 | 时间 | 说明 |
| V3.3 | 2026-07-23 | loop_data: 消灭 data_json[1024] BSS 缓冲 + coil_count 硬限, 防 mqttBuf 重叠致 _raw 异常 |
|------|------|------|
| V3.2 | 2026-07-10 | 双主题发布统一 + initialize 数据格式对齐 V1.03 + mqtt_publish packet_id=0 断连修复 |
| V3.1 | 2026-07-09 | V1.03: 订阅后发 initialize 上线消息; iot_mqtt_srv 订阅改双主题 |