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();
|
dg_subscribe_display_topic();
|
||||||
dev_initialize_pub();
|
dev_initialize_pub();
|
||||||
reset_net_active_timeup();
|
reset_net_active_timeup();
|
||||||
|
g_iot_state = IOT_STATE_READY; // Sync iot_mqtt_srv state
|
||||||
break;
|
break;
|
||||||
case PUBLISH:
|
case PUBLISH:
|
||||||
MQTTDeserialize_publish(&dup, &qos, &retained, &packetid,
|
MQTTDeserialize_publish(&dup, &qos, &retained, &packetid,
|
||||||
@@ -409,6 +410,8 @@ void mqtt_data_manage(uint8_t id)
|
|||||||
break;
|
break;
|
||||||
case PINGRESP:
|
case PINGRESP:
|
||||||
PRINT("MQTT PINGRESP\n");
|
PRINT("MQTT PINGRESP\n");
|
||||||
|
if(flag_mqtt_ping_err)
|
||||||
|
flag_mqtt_ping_err = 0;
|
||||||
reset_net_active_timeup();
|
reset_net_active_timeup();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -541,6 +544,7 @@ uint8_t i;
|
|||||||
}
|
}
|
||||||
if (intstat & SINT_STAT_DISCONNECT) {
|
if (intstat & SINT_STAT_DISCONNECT) {
|
||||||
PRINT("TCP Disconnect (MQTT)\n");
|
PRINT("TCP Disconnect (MQTT)\n");
|
||||||
|
g_iot_state = IOT_STATE_DISCONNECTED;
|
||||||
g_net_state.flag = 1;
|
g_net_state.flag = 1;
|
||||||
}
|
}
|
||||||
if (intstat & SINT_STAT_TIM_OUT) {
|
if (intstat & SINT_STAT_TIM_OUT) {
|
||||||
@@ -635,6 +639,12 @@ void poll_mqtt(void)
|
|||||||
// return;
|
// 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)
|
if(flag_mqtt_ping_send)
|
||||||
{
|
{
|
||||||
flag_mqtt_ping_send = 0;
|
flag_mqtt_ping_send = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user