打印
[应用相关]

一种处理LWIP在正常通讯时断线重连的方法

[复制链接]
4008|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 纪国圣 于 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.
LWIP_NETIF_LINK_CALLBACK用于使能网络连接状态变化回调函数的调用。使能后ethernetif.c文件中的void ethernetif_update_config(struct netif *netif)起作用,用于网络连接状态变化时底层的操作。
LWIP_SO_RCVTIMEO使能接收超时。
2.

在lwip.c文件中屏蔽dhcp_start是因为在后续的程序中会专门开一个线程去处理DHCP的事物;netif_set_link_callback用于注册回调函数;之后为网络状态监测开一个线程,线程名称为ethernetif_set_link。
3.
4.
void ethernetif_notify_conn_changed(struct netif *netif)被void ethernetif_update_config(struct netif *netif)调用,一般可以添加用户所需的特定代码。这里主要改变DHCP的状态码。
5.
void User_notification(struct netif *netif)用于在进入WaitDHCPTask线程时根据网络状态初始化DHCP的状态码。
6.
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这个回调函数。可以通过下图的调用关系看出。
---------------------->
---------------------->
之间的关系图也可以如下图表示:

继续配置LWIP:
7.


void WaitDHCPTask(void const * argument)线程用于获取IP地址。操作过程通过状态码执行形影的程序。
8.
在测试程序中添加超时等待时间,当在规定的时间内未接收到数据时,服务器可以断开连接,同时从源代码分析可以知道这样也是有益的。


从源码中可以看出,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)




使用特权

评论回复
沙发
mmuuss586| | 2020-2-27 16:26 | 只看该作者
感谢分享

使用特权

评论回复
板凳
610u| | 2020-2-27 20:41 | 只看该作者
我怕是对一秒钟有什么误解???。。。。。

使用特权

评论回复
地板
610u| | 2020-2-27 20:42 | 只看该作者
看错了,看成一秒钟处理LWIP在正常通讯时断线重连的方法。。。。

使用特权

评论回复
5
610u| | 2020-2-27 20:42 | 只看该作者
下载附件,研究一下吧,心累。

使用特权

评论回复
6
liuchangyin| | 2020-2-28 11:19 | 只看该作者
666

使用特权

评论回复
7
dengzhengbing| | 2020-9-8 08:17 | 只看该作者
初接触lwip,正需要,谢谢

使用特权

评论回复
8
香水城| | 2020-9-8 10:19 | 只看该作者
谢谢分享!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

407

帖子

5

粉丝