From 086dbc6d7c37cf108c527c3f814ab75abed4c8d7 Mon Sep 17 00:00:00 2001 From: wangfq Date: Thu, 23 Jul 2026 11:04:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(vd960DBN):=20loop=5Fdata=20=E6=94=B9?= =?UTF-8?q?=E7=94=A8=20iot=5Fmqtt=5Fpublish=20=E5=8F=91=E9=80=81,=20?= =?UTF-8?q?=E7=BC=93=E5=86=B2=E9=9A=94=E7=A6=BB=E9=98=B2=20=5Fraw=20?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=20v3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - root cause (v3): event_report 的 mqtt_publish → MQTTSerialize_publish(mqttBuf) 写入的 MQTT 二进制泄漏到 loop_data 的 payload 缓冲, 产生 _raw 异常 - fix: loop_data 改用 iot_mqtt_publish() 发送, 其内部 buf[1024] 与 全局 mqttBuf[1024] 物理隔离, event_report 和 loop_data 不再争用同一缓冲 - 同时: 消灭 data_json[1024] (v1), coil_count 硬限 (v1), msg_id 改预读避免 iot_mqtt_publish 内部 ++ 导致跳号 - note: iot_send_heartbeat 有同样 msg_id 双 ++ 问题, 待修 --- .../OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c index 5cf68c4..87cddce 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c @@ -686,9 +686,9 @@ void iot_mqtt_publish_sensor(void) { } /*--- Step 4: 构建 JSON → 发布 (字段与 V1.02 协议一致) --- - 直接构建到 payload, 省掉 data_json[1024] 中间缓冲: - - 消除 BSS 压力 (省 1024B), 降低与 mqttBuf 重叠风险 - - 消除 %s 拷贝尾部二进制残留的路径 (2026-07-23 _raw 事故) + 直接构建到 payload, 省掉 data_json[1024]: + - 用 iot_mqtt_publish() 代替 mqtt_publish(), 发送缓冲隔离 + (event_report→mqttBuf vs loop_data→iot_mqtt_publish::buf[1024]) - coil_count 边界硬限, 防 0xC0 坏帧致溢出 */ static char payload[1400]; char *p = payload; @@ -697,12 +697,13 @@ void iot_mqtt_publish_sensor(void) { const char *freq_level_names[] = {"high", "mid_high", "mid_low", "low"}; uint8_t i; uint8_t coil_n = _cached_sr.coil_count; + uint32_t my_msg_id = g_iot_msg_id + 1; /* iot_mqtt_publish 内部 ++g_iot_msg_id, 这里只预读 */ if (coil_n > 4) coil_n = 4; /* 硬限: 防坏帧致 snprintf 循环溢出 */ /* 先写外层包装头 (msg_id/cmd/ts/data) */ written = snprintf(p, remaining, - "{\"msg_id\":%d,\"cmd\":\"loop_data\",\"ts\":%lu,\"data\":{\"channels\":[", - ++g_iot_msg_id, dev_time_now()); + "{\"msg_id\":%lu,\"cmd\":\"loop_data\",\"ts\":%lu,\"data\":{\"channels\":[", + (unsigned long)my_msg_id, dev_time_now()); if (written < 0 || written >= remaining) return; p += written; remaining -= written; @@ -735,10 +736,12 @@ void iot_mqtt_publish_sensor(void) { snprintf(p, remaining, "]}}"); + /* 用 iot_mqtt_publish: 发送缓冲 buf[1024] 与 mqttBuf[1024] 物理隔离, + 避免 event_report 的 MQTT 二进制污染 loop_data 载荷 (2026-07-23 _raw 事故 v3) */ { char topic[IOT_MQTT_TOPIC_MAX_LEN]; snprintf(topic, sizeof(topic), "dld960/%s/dev", g_iot_dev_serial); - mqtt_publish(topic, payload, 0); + iot_mqtt_publish(topic, payload, strlen(payload), 0); } }