fix(iot_mqtt): 精简 loop_data JSON 避免 WCHNET_SocketSend 超大包崩溃

问题: 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 时跳过并打印警告
This commit is contained in:
wangfq
2026-07-08 15:09:50 +08:00
parent 555cdb741d
commit a71adaafdc
@@ -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);