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:
@@ -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 订阅改双主题 |
|
||||
|
||||
Reference in New Issue
Block a user