[应用相关] 一种处理LWIP在正常通讯时断线重连的方法

[复制链接]
5743|7
 楼主| 纪国圣 发表于 2020-2-26 11:36 | 显示全部楼层 |阅读模式
本帖最后由 纪国圣 于 2020-2-26 11:37 编辑

硬件平台为STM32F429-Nucleo

软件平台为STM32CubeMXv5.5+keilv5(采用零级优化
                HAL库版本为V1.24.2
                FreeRTOS版本为10.0.1
                CMSIS-RTOS版本为1.02
                LWIP版本为2.0.3
在按板卡选择且外设一切都是默认情况下,勾选了FreeRTOS和LWIP,参数是默认值。生成代码。按下图中所示修改配置。并移植一份下位机作为服务器的回环测试程序。
1.png
2.png
3.png
如果回环测试功能正常,则可以按下图继续修改:
1. 1_1.png
LWIP_NETIF_LINK_CALLBACK用于使能网络连接状态变化回调函数的调用。使能后ethernetif.c文件中的void ethernetif_update_config(struct netif *netif)起作用,用于网络连接状态变化时底层的操作。
LWIP_SO_RCVTIMEO使能接收超时。
2. 1_2.png
1_3.png
在lwip.c文件中屏蔽dhcp_start是因为在后续的程序中会专门开一个线程去处理DHCP的事物;netif_set_link_callback用于注册回调函数;之后为网络状态监测开一个线程,线程名称为ethernetif_set_link。
3. 1_4.png
4. 1_5.png
void ethernetif_notify_conn_changed(struct netif *netif)被void ethernetif_update_config(struct netif *netif)调用,一般可以添加用户所需的特定代码。这里主要改变DHCP的状态码。
5. 1_6.png
void User_notification(struct netif *netif)用于在进入WaitDHCPTask线程时根据网络状态初始化DHCP的状态码。
6. 1_7.png
void ethernetif_set_link(void const *argument)线程通过周期性的读取PHY的PHY_LINKED_STATUS | PHY_AUTONEGO_COMPLETE,获知网络连接情况。当断线重连时,通过PHY的寄存器可以感知到网络的这些变换,并通过netif_set_link_up/netif_set_link_down来触发ethernetif_update_config这个回调函数。可以通过下图的调用关系看出。
netif_set_link_callback实例.png ----------------------> netif_set_link_callback.png
netif_set_link_up.png ----------------------> NETIF_LINK_CALLBACK.png
之间的关系图也可以如下图表示:
调用关系.png
继续配置LWIP:
7. 1_8.png
1_9.png
1_10.png
void WaitDHCPTask(void const * argument)线程用于获取IP地址。操作过程通过状态码执行形影的程序。
8. 1_11.png
在测试程序中添加超时等待时间,当在规定的时间内未接收到数据时,服务器可以断开连接,同时从源代码分析可以知道这样也是有益的。
1_13.png
1_12.png
从源码中可以看出,netconn_recv中通过调用sys_arch_mbox_fetch来获取接受到的消息,而sys_arch_mbox_fetch又是通过osMessageGet来获取消息的。如果超时时间为0,则程序会执行event = osMessageGet (*mbox, osWaitForever)语句,这时候程序一直等待而不能及时释放网络资源,造成重连后通讯失败。
同理不开启LWIP_SO_RCVTIMEO,程序也会执行sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0),最终还是会跳到event = osMessageGet (*mbox, osWaitForever)语句。
按照上述修改之后,LWIP就有在正常通讯下断线自动重连的功能了。
对于因为初始化时未连接网线导致初始化失败,不能联网的情况,本例子没有做处理。这种情况可以通过设置初始化成功/失败标志位记录状态,再通过ethernetif_set_link线程根据标志位和网络状态决定是否重新执行初始化操作。
FreeRTOS_LWIP DHCP 断线检测.zip (2.24 MB, 下载次数: 97)




mmuuss586 发表于 2020-2-27 16:26 | 显示全部楼层
感谢分享
610u 发表于 2020-2-27 20:41 | 显示全部楼层
我怕是对一秒钟有什么误解???。。。。。
610u 发表于 2020-2-27 20:42 | 显示全部楼层
看错了,看成一秒钟处理LWIP在正常通讯时断线重连的方法。。。。
610u 发表于 2020-2-27 20:42 | 显示全部楼层
下载附件,研究一下吧,心累。
liuchangyin 发表于 2020-2-28 11:19 | 显示全部楼层
dengzhengbing 发表于 2020-9-8 08:17 | 显示全部楼层
初接触lwip,正需要,谢谢
香水城 发表于 2020-9-8 10:19 | 显示全部楼层
谢谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

407

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部