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内核是已经实现好的,只需要编写接收的逻辑代码就可以了。