FreeRTOS WiFi断网事件未调用vApplicationIPNetworkEventHook的解决咨询
Amazon FreeRTOS WiFi断连事件上报及重连实现方案
1 实现WiFi状态变更回调注册逻辑
首先在iot_wifi.c文件头部定义静态全局变量存储注册的回调函数:
static IotNetworkStateChangeEventCallback_t xNetworkStateCallback = NULL;
修改你提到的WIFI_RegisterNetworkStateChangeEventCallback函数:
WIFIReturnCode_t WIFI_RegisterNetworkStateChangeEventCallback( IotNetworkStateChangeEventCallback_t xCallback ) { if(xCallback == NULL) { return eWiFiParameterError; } xNetworkStateCallback = xCallback; return eWiFiSuccess; }
2 驱动层上报网络断开事件
找到WiFi驱动中打印网络断开日志的代码位置,添加以下逻辑:
- 调用FreeRTOS+TCP栈提供的
vIPNetworkDown()函数,触发TCP/IP栈的网络断开事件,该调用会自动触发vApplicationIPNetworkEventHook回调,事件类型为eNetworkDown - 若有已注册的WiFi状态变更回调,同步调用回调传递断开事件
示例代码:
// 驱动中检测到WiFi断连的位置 // 原有逻辑:打印断连日志 WIFI_PrintLog("WiFi disconnected"); // 新增逻辑:上报事件到TCP/IP栈 vIPNetworkDown(); // 新增逻辑:触发WiFi状态变更回调 if(xNetworkStateCallback != NULL) { xNetworkStateCallback(eWiFiStateDisconnected); }
如果是网络上线的场景,对应调用vIPNetworkUp()即可触发eNetworkUp事件。
3 补充vApplicationIPNetworkEventHook回调逻辑
在应用层实现该回调,处理上下线事件:
void vApplicationIPNetworkEventHook( eIPCallbackEvent_t eNetworkEvent ) { if( eNetworkEvent == eNetworkDown ) { // 此处添加WiFi重连逻辑 WIFI_ConnectAP(&xWiFiParams); } else if( eNetworkEvent == eNetworkUp ) { // 网络上线后的处理逻辑,比如初始化MQTT连接等 } }
4 必要配置检查
- 确保
FreeRTOSIPConfig.h中宏configUSE_IP_NETWORK_EVENT_HOOK配置为1,开启网络事件回调功能 - 系统初始化WiFi组件后,调用
WIFI_RegisterNetworkStateChangeEventCallback注册自定义的状态变更回调(如不需要可以省略,仅保留TCP/IP栈事件上报即可)
内容的提问来源于stack exchange,提问作者CaptainMJ
相关产品推荐
相关产品推荐

