从零实现 LWIP 四(一对一 UDP、TCP客户端 DHCP 网线热插拔和自动重新连接)
上一章是cubemx的配置过程,那么本章将要实现具体的UDP功能。
我们先来了解一下LWIP分层结构:
UDP是不需要握手的,但是也需要在同一个网关中。如果作为client,需要知道目标地址;如果作为server,则需要允许同一个网关中的所有IP与其进行连接。
这部分应用层的代码来自:stm32+lwip(一):使用STM32CubeMX生成项目(必看),该作者是54zorb,代码风格非常好。
在看代码时需要注意两个结构体,一个结构体是在LWIP.c中的全局网络接口控制块 struct netif gnetif;
另一个是局部UDP控制块 static struct udp_pcb *upcb;
一个UDP client、UDP server实现的过程如下:
初始化以太网->初始化LWIP->初始化udp client或server(主要是建立UDP控制块、注册接收回调函数)
在while(1)循环调用LWIP处理函数MX_LWIP_Process();(执行具体的通讯操作)
这样就是LWIP的作者的设计思想,将数据处理过程与通讯处理分开,这样通讯效率最高。
代码部分还需要详细看工程,就不再赘述了。
此外实验环境是用开发板与计算机相连,我们看到这是让计算机也使用静态IP方便调试。
此时,开启网络调试助手,发现能够连接上,但是发送数据失败。也能够ping通
百度后发现还需要关闭win10的防火墙,全部关闭
再次建立连接,再次发送成功了。
总结:在防火墙那里卡了很久,如果不是百度真的解决不了,这不是代码层面的问题了。
需要对代码的层次先进行了解,因为LWIP的文件非常多,多看看这张图,以及LwIP协议栈的设计与实现_中文译稿.pdf 。
参考资料:原子的STM32F429开发指南HAL.pdf、LwIP协议栈的设计与实现_中文译稿.pdf
stm32+lwip(一):使用STM32CubeMX生成项目(必看)
STM32407+LAN8720A+LWIP 实现TCP Client
非常感谢他们的分享