From a71adaafdc724f7358cc957df78a605c6bafa5e8 Mon Sep 17 00:00:00 2001 From: wangfq Date: Wed, 8 Jul 2026 15:09:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(iot=5Fmqtt):=20=E7=B2=BE=E7=AE=80=20loop=5F?= =?UTF-8?q?data=20JSON=20=E9=81=BF=E5=85=8D=20WCHNET=5FSocketSend=20?= =?UTF-8?q?=E8=B6=85=E5=A4=A7=E5=8C=85=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: 4通道传感器数据 JSON ~700字节 → MQTT Publish 733字节 超过 WCHNET TCP MSS(576) 和原始 MAX_MQTTBUF_LEN(512) 设计上限 WCHNET_SocketSend(733) 导致设备重启 修复: - 移除非必要字段: freq_current, freq_diff, condition - 展平 misc 嵌套对象 → mt(类型) + mv(数值) - 缩短 key 名: freq_level→fl, has_car→car, loop_ok→ok, sensitivity→sens - 每通道 ~70字, 4通道 ~280, 全包 ~400字节 - 加安全检查: payload >450 时跳过并打印警告 --- .../APP/iot_mqtt_srv.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c index acb09e7..353ba99 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c @@ -414,17 +414,14 @@ void iot_mqtt_publish_sensor(void) { const char *freq_level_names[] = {"high", "mid_high", "mid_low", "low"}; written = snprintf(p, remaining, - "%s{\"ch\":%d,\"freq_level\":\"%s\",\"has_car\":%s," - "\"loop_ok\":%s,\"freq_current\":%lu,\"freq_diff\":%d," - "\"sensitivity\":%d,\"condition\":%d," - "\"misc\":{\"type\":\"%s\",\"value\":%lu}}", + "%s{\"ch\":%d,\"fl\":\"%s\",\"car\":%s," + "\"ok\":%s,\"sens\":%d,\"mt\":\"%s\",\"mv\":%lu}", (i > 0) ? "," : "", i + 1, freq_level_names[cs->freq_level], cs->car_state ? "true" : "false", cs->loop_state ? "false" : "true", - cs->freq, cs->variation, - cs->sensitivity, cs->condition, + cs->sensitivity, misc_type_str, misc_val); if (written < 0 || written >= remaining) goto done; p += written; remaining -= written; @@ -440,7 +437,14 @@ void iot_mqtt_publish_sensor(void) { char topic[IOT_MQTT_TOPIC_MAX_LEN]; iot_make_topic(topic, sizeof(topic), "dev", "data", "loop"); - iot_mqtt_publish(topic, payload, strlen(payload), 0); + { + uint16_t plen = (uint16_t)strlen(payload); + if (plen > 450) { + PRINT("IOT: payload too large (%u bytes), skipping\n", plen); + } else { + iot_mqtt_publish(topic, payload, plen, 0); + } + } done: InitPkgUart(&g_pkg_uart_2);