Wi-Fi UDP客户端测试
该教程演示如何通过开发板进行Wi-Fi后,创建UDP客户端,连接UDP服务端进行数据收发测试。
一、准备工作
- 准备1块BearPi-Pico H3863开发板
- 准备一个手机,用于开启无线热点
二、编译 Wi-Fi UDP Sample代码
在Windows下编译操作
点击工具栏中的“系统配置”,打开配置界面.
选择Support UDP Client Sample
Application ---> [*] Enable Sample. [ ] Enable the Sample of peripheral. [*] Enable the Sample of WIFI. [ ] Support WIFI STA Sample [ ] Support WIFI SoftAP Sample. [*] Support UDP Client Sample. [ ] Enable the Sample of products.
按下"Save"键保存配置。
打开udp_client.c,将Wi-Fi的连接信息修改成自己手机开启热点的Wi-Fi账号和密码,服务器IP改成自己电脑的IP,此处注意要将电脑提前接入自己手机开启热点,这样能让开发板与电脑处于同个局域网。
关键代码,位于
application\samples\wifi\udp_client\udp_client.c
int udp_client_sample_task(void *param) { param = param; // 在sock_fd 进行监听,在 new_fd 接收新的链接 int sock_fd; // 服务器的地址信息 struct sockaddr_in send_addr; socklen_t addr_length = sizeof(send_addr); char recvBuf[512]; // 连接Wifi wifi_connect(CONFIG_WIFI_SSID, CONFIG_WIFI_PWD); // 创建socket printf("create socket start!\r\n"); if ((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { printf("create socket failed!\r\n"); return 0; } printf("create socket end!\r\n"); // 初始化预连接的服务端地址 send_addr.sin_family = AF_INET; send_addr.sin_port = htons(CONFIG_SERVER_PORT); send_addr.sin_addr.s_addr = inet_addr(CONFIG_SERVER_IP); addr_length = sizeof(send_addr); while (1) { bzero(recvBuf, sizeof(recvBuf)); // 发送数据到服务远端 printf("sendto start!\r\n"); sendto(sock_fd, send_data, strlen(send_data), 0, (struct sockaddr *)&send_addr, addr_length); printf("sendto end!\r\n"); // 线程休眠一段时间 osDelay(100); // 接收服务端返回的字符串 recvfrom(sock_fd, recvBuf, sizeof(recvBuf), 0, (struct sockaddr *)&send_addr, &addr_length); printf("%s:%d=>%s\n", inet_ntoa(send_addr.sin_addr), ntohs(send_addr.sin_port), recvBuf); } // 关闭这个 socket lwip_close(sock_fd); return 0; }
编译烧录固件
参考环境搭建教程编译烧录代码
在Ubuntu下编译操作
在MobaXterm中输入:
./build.py menuconfig ws63-liteos-app
选择Support UDP Client Sample
Application ---> [*] Enable Sample. [ ] Enable the Sample of peripheral. [*] Enable the Sample of WIFI. [ ] Support WIFI STA Sample [ ] Support WIFI SoftAP Sample. [*] Support UDP Client Sample. [ ] Enable the Sample of products.
按下"ESC"键退出并保存配置。
打开udp_client.c,将Wi-Fi的连接信息修改成自己手机开启热点的Wi-Fi账号和密码,服务器IP改成自己电脑的IP,此处注意要将电脑提前接入自己手机开启热点,这样能让开发板与电脑处于同个局域网。
关键代码,位于
application\samples\wifi\udp_client\udp_client.c
int udp_client_sample_task(void *param) { param = param; // 在sock_fd 进行监听,在 new_fd 接收新的链接 int sock_fd; // 服务器的地址信息 struct sockaddr_in send_addr; socklen_t addr_length = sizeof(send_addr); char recvBuf[512]; // 连接Wifi wifi_connect(CONFIG_WIFI_SSID, CONFIG_WIFI_PWD); // 创建socket printf("create socket start!\r\n"); if ((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { printf("create socket failed!\r\n"); return 0; } printf("create socket end!\r\n"); // 初始化预连接的服务端地址 send_addr.sin_family = AF_INET; send_addr.sin_port = htons(CONFIG_SERVER_PORT); send_addr.sin_addr.s_addr = inet_addr(CONFIG_SERVER_IP); addr_length = sizeof(send_addr); while (1) { bzero(recvBuf, sizeof(recvBuf)); // 发送数据到服务远端 printf("sendto start!\r\n"); sendto(sock_fd, send_data, strlen(send_data), 0, (struct sockaddr *)&send_addr, addr_length); printf("sendto end!\r\n"); // 线程休眠一段时间 osDelay(100); // 接收服务端返回的字符串 recvfrom(sock_fd, recvBuf, sizeof(recvBuf), 0, (struct sockaddr *)&send_addr, &addr_length); printf("%s:%d=>%s\n", inet_ntoa(send_addr.sin_addr), ntohs(send_addr.sin_port), recvBuf); } // 关闭这个 socket lwip_close(sock_fd); return 0; }
编译烧录固件
参考环境搭建教程编译烧录代码
三、测试
使用 Socket 调试工具 创建UDP服务端用于测试。
Socket 调试工具下载地址: 点击跳转
示例代码编译烧录代码后,按下开发板的RESET按键,在数据发送窗口输入要发送的数据,点击发送后开发板会回复固定消息,且开发板收到消息后会通过日志打印出来。
192.168.1.175:8888=>Hello! I'm UDP Server!
注:如果开发板连不上这个UDP服务端,请关闭电脑所有的防火墙和杀毒软件后再尝试重新连接