示例:
********************** TCP Server and Client using NETCONN || STM32
NETCONN编程简介及应用
LWIP简介
LWIP是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。为了简化处理过程和内存要求,lwIP对API进行了裁减,可以不需要复制一些数据。
编程接口
LWIP有三种编程接口:
1. RAW 可以不需要操作系统,但是复杂,主要使用需要掌握回调函数的使用。
2. NETCONN 需要操作系统支持,但是简单
3. SOCKET 需要操作系统支持,简单,有内存拷贝会浪费内存。
NETCONN
数据缓冲区-netbuf
netbuf-API
连接结构-netconn
在使用NETCONN接口的时候不管你是UDP还是TCP统一使用一个连接结构—netconn,这样应用程序就可以忽略掉连接类型的差异,使用统一的连接结构和编程函数,在api.h中定义了netconn结构体。
netconn-API
LWIP学习笔记6——使用 NETCONN 接口编程_lwip netconn-CSDN博客
FREERTOS+LWIP多客户端连接实现_lwip +freertos-CSDN博客
9. 有操作系统移植LwIP — [野火]LwIP应用开发实战指南—基于RT1052 文档
16. 使用NETCONN接口编程 — [野火]LwIP应用开发实战指南—基于RT1052 文档
17. 使用Socket接口编程 — [野火]LwIP应用开发实战指南—基于RT1052 文档
【FreeRTOS】基于STM32移植LWIP 2.1.2之TCP Client应用篇_stm32h563 freertos移植tcpip-CSDN博客
【FreeRTOS】基于STM32移植LWIP 2.1.2之TCP Server应用篇_lwip 2.2.0 freertos-CSDN博客
STM32+FreeRTOS+lwip+Netconn+TCP Server做并发服务器的编写经验总结
使用LWIP的netconn接口在STM32上建立一个客户端_netconn实现客户端-CSDN博客
STM32F407ZGT6 FreeRTOS LAN8720A LWIP NETCONN服务器_stm32407zgt6 lan8720-CSDN博客
STM32以太网通信-FreeRTOS + LwIP移植_stsw-stm32070.zip-CSDN博客
STM32+FreeRTOS+LWIP TCP Server多端口并发通信实例_raw lwip的tcp server多端口并发数据通信-CSDN博客
【STM32F407+CUBEMX+FreeRTOS+lwIP netconn UDP TCP记录】_freertos udp编程-CSDN博客
STM32CubeMX+LAN8720+LWIP+FreeRTOS实现网络通讯_stm32cubemx如何移植lwip、-CSDN博客
网络异常、断开、掉线重连等:
STM32 LWIP Server、Client如何判断网络异常_lwip检测网络状态-CSDN博客
stm32 LWIP 作为server如何在通信中判断网络异常(如网线断开)_lwip检测网络状态-CSDN博客
lwip+freeRTOS 实现热插拔功能_wait for linked status-CSDN博客
LWIP 的socket接口下接收超时的处理_lwip netconn 超时接收数据-CSDN博客
STM32F407 LWIP掉线重连_lwip 断线 重连-CSDN博客
FreeRTOS下LWIP的TCP简单使用_freertos lwip tcp-CSDN博客】
从零开始Cubemx配置STM32搭载freeRTOS以及lwip实现tcp网络通信(二)_cubemx lwip-CSDN博客
stm32单片机与FreeRTOS、LwIP内存堆栈使用情况分析_freertos lwip-CSDN博客
MQTT:
【FreeRTOS】基于STM32移植LWIP 2.1.2之MQTT_freertos + lwip +mqtt-CSDN博客
MQTT源码下载地址:https://github.com/eclipse/paho.mqtt.embedded-c
STM32F407VET6 基于FreeRTOS实时操作系统和LwIP协议栈创建TCP客户端
NETCONN步骤:
步骤:正点原子lwIP学习笔记——NETCONN接口TCP实验_lwip netconn-CSDN博客
1. NETCONN接口TCPClient连接配置
NETCONN实现TCP的客户端连接需要以下步骤:
调用函数netconn_new创建TCP控制块;
调用函数netconn_connect连接服务器;
设置接收超时时间tcp_clientconn->recv_timeout;
调用函数netconn_getaddr获取远端IP地址和端口号;
调用函数netconn_write和netconn_recv收发数据。
这里要注意,udp调用的是netconn_send进行发送数据;tcp需要调用netconn_write发送;两者的接收都是netconn_recv。
2. NETCONN接口TCPClient实验
例程功能:
本实验使用NETCONN 编程接口实现 TCP Client 连接,我们可通过按下 KEY 0 按键发送数
据至网络调试助手,还可以接收网络调试助手发送的数据,并在 LCD 显示屏上显示 。
基本的源码跟UDP是很类似的,其中freertos_demo仅有提示信息不同(lcd显示屏的显示内容);
lwip_demo中,调用netconn_new创建一个tcp_clientconn的tcp控制块,再调用netconn_connect,连接上远程IP地址和端口;然后新建一个netbuf指针recvbuf,设置recv_timeout为10ms后,使用netconn_getaddr连接服务器;
如果flag判断需要发送,那么就调用netconn_write进行消息的发送,然后把flag清零;如果netconn_recv接收到消息,会先进入临界区,然后通过memset清除数据缓冲区,调用memcpy把传入的pbuf数据进行拷贝,然后退出数据缓冲区;调用xQueueSend发送邮箱,发送的内容就是数据缓冲区的地址,发送后释放recvbuf的内存(netconn_recv接收到的pbuf数据);
如果收到退出连接的信号,会调用netconn_close然后netconn_delete释放tcp控制块,最后break出连接上服务器处理的while循环,重新回到建立连接的循环之中。
3. NETCONN接口TCPServer连接配置
NETCONN实现TCP服务器有以下步骤:
调用函数netconn_new创建TCP控制块;
调用函数netconn_bind绑定TCP控制块、本地IP地址和端口号;
调用函数netconn_listen进入监听模式;
设置接受超时时间conn->recv_timeout;
调用函数netconn_accept接收连接请求;
调用函数netconn_getaddr获取远端IP地址和端口号;
调用函数netconn_write和netconn_recv收发数据。
4. NETCONN接口TCPServer实验
本实验使用NETCONN 编程接口实现 TCPServer 连接,我们可通过按下 KEY 0 按键发送
数据至网络调试助手,还可以接收网络调试助手发送的数据,并在 LCD 显示屏上显示 。
在freertos_demo中,首先定义好任务的优先级和任务堆栈大小,然后编写lwip_test_ui的显示界面;进入freertos_demo中,创建start_task任务并开启任务调度;start_task中就是调用了lwip_test_ui进行显示,然后进入lwip_comm_init循环完成IP地址分配;然后会进入临界区,xQueueCreate创建消息队列g_display_queue;创建lwip任务、key任务、LED任务以及显示任务;然后会vTaskDelete删除开始任务并退出临界区;
key任务就是扫描按键,按下之后就会标志位置1,进而发送消息;
LED任务,就是不断翻转LED,提示系统正在运行;
显示任务,就是在LCD屏幕上显示接收到的消息,如果g_display_queue非空,就代表消息队列接收到消息,调用xQueueReceive把消息从g_display_queue搬运到定义好的buffer之中并进行显示,然后myfree释放掉buffer内存;
在lwip_demo中,调用netconn_new创建一个TCP控制块,然后netconn_bind绑定刚创建的tcp_serverconn的本地IP地址以及端口号;然后调用netconn_listen进入监听tcp_serverconn并设置tcp_serverconn->recv_timeout为10ms;
进入while死循环后,通过netconn_accept接收连接请求,如果接收到,建立一个netbuf的结构体指针recvbuf,把获得的远程IP地址和端口号由netconn_getaddr给到接收的newconn(是一开始申请的netconn结构体指针);
接收发送消息和之前的TCP Client很类似,就不再赘述了,往上翻就有了。
总结
NETCONN接口的TCP实验,相较于RAW接口方便了很多,通过封装可以更简单的调用函数,同时不需要手动来实现这些回调函数,lwIP内核是已经实现好的,只需要编写接收的逻辑代码就可以了。