From 0e116c2d318874289bd803084b578e3b2b86e397 Mon Sep 17 00:00:00 2001 From: wangfq Date: Wed, 8 Jul 2026 08:55:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(net=5Fsrv):=20MQTT=20=E4=B8=BB=E5=8A=A8?= =?UTF-8?q?=E4=B8=8A=E6=8A=A5=E6=97=A0=E6=95=B0=E6=8D=AE=20+=20PINGREQ=20?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=E5=AF=BC=E8=87=B4=E6=96=AD=E8=BF=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题1: iot_mqtt_publish_sensor() 检查 g_iot_state != IOT_STATE_READY 直接 return, 但 g_iot_state 从未被 net_srv.c 内联 MQTT 处理器设置为 READY → 无传感数据上报 问题2: poll_mqtt() 依赖 flag_mqtt_ping_send 触发 PINGREQ, 但该标志从未被设为 1 → broker keepalive 超时断连 (~12s) 修复: - mqtt_data_manage() CONNACK: 设 g_iot_state=IOT_STATE_READY - WCHNET_HandleSockInt DISCONNECT: 设 g_iot_state=IOT_STATE_DISCONNECTED - mqtt_data_manage() PINGRESP: 重置 flag_mqtt_ping_err - poll_mqtt(): g_activ_counter > 9000 自动触发 PINGREQ --- vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/net_srv.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/net_srv.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/net_srv.c index daf2134..5404afc 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/net_srv.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/net_srv.c @@ -392,6 +392,7 @@ void mqtt_data_manage(uint8_t id) dg_subscribe_display_topic(); dev_initialize_pub(); reset_net_active_timeup(); + g_iot_state = IOT_STATE_READY; // Sync iot_mqtt_srv state break; case PUBLISH: MQTTDeserialize_publish(&dup, &qos, &retained, &packetid, @@ -409,6 +410,8 @@ void mqtt_data_manage(uint8_t id) break; case PINGRESP: PRINT("MQTT PINGRESP\n"); + if(flag_mqtt_ping_err) + flag_mqtt_ping_err = 0; reset_net_active_timeup(); break; default: @@ -541,6 +544,7 @@ uint8_t i; } if (intstat & SINT_STAT_DISCONNECT) { PRINT("TCP Disconnect (MQTT)\n"); + g_iot_state = IOT_STATE_DISCONNECTED; g_net_state.flag = 1; } if (intstat & SINT_STAT_TIM_OUT) { @@ -635,6 +639,12 @@ void poll_mqtt(void) // return; // } // + /* Auto-trigger PINGREQ every MQTT_KEEPALIVE_INTERVAL seconds of inactivity */ + if (g_activ_counter > (MQTT_KEEPALIVE_INTERVAL * 1000)) { + g_activ_counter = 0; + flag_mqtt_ping_send = 1; + } + if(flag_mqtt_ping_send) { flag_mqtt_ping_send = 0;