正点原子lwIP学习笔记——NETCONN接口TCP实验

1. NETCONN接口TCPClient连接配置

NETCONN实现TCP的客户端连接需要以下步骤:

  1. 调用函数netconn_new创建TCP控制块;
  2. 调用函数netconn_connect连接服务器;
  3. 设置接收超时时间tcp_clientconn->recv_timeout;
  4. 调用函数netconn_getaddr获取远端IP地址和端口号;
  5. 调用函数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服务器有以下步骤:

  1. 调用函数netconn_new创建TCP控制块;
  2. 调用函数netconn_bind绑定TCP控制块、本地IP地址和端口号;
  3. 调用函数netconn_listen进入监听模式;
  4. 设置接受超时时间conn->recv_timeout;
  5. 调用函数netconn_accept接收连接请求;
  6. 调用函数netconn_getaddr获取远端IP地址和端口号;
  7. 调用函数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内核是已经实现好的,只需要编写接收的逻辑代码就可以了。

你可能感兴趣的:(lwIP学习,学习,笔记,tcp/ip,stm32,网络协议)