fix(net_srv): MQTT 主动上报无数据 + PINGREQ 缺失导致断连
问题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
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user