在使用ART-PI 硬件开启WiFi联网之后,就可以进行TCP和UDP协议编程了。ART-PI WIFI联网方法
在Settings 中查看网络选项中是否选中了以下的三层。

随后再查看以下选择项是否正常启动。一般来说这些是默认打开的。

确保以上项都已经选择后。新建一个文件:

程序如下:
cpp
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2026-10-12 yinchenxi the first version
*/
#include <rtthread.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <sys/time.h>
rt_thread_t rth_udp_send;
rt_thread_t rth_upd_recv;
#define SERVERIP "172.20.10.2"
#define SERVER_PORT 8888
typedef struct{
int sock;
struct sockaddr_in server_addr;
}UDP_Sock;
int sendcnt = 0;
static void udp_client_recv_entry(void* parmater)
{
UDP_Sock *udpsock = (UDP_Sock*)parmater;
char recv_buf[128];
int recv_len;
struct timeval tv_out;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
tv_out.tv_sec = 3;
tv_out.tv_usec = 0;
setsockopt(udpsock->sock, SOL_SOCKET, SO_RCVTIMEO, &tv_out, sizeof(tv_out));
while(1)
{
recv_len = recvfrom(udpsock->sock, recv_buf,sizeof(recv_buf)-1, 0,
(struct sockaddr *)&client_addr, &addr_len);
if(recv_len > 0)
{
recv_buf[recv_len] = '\0';
rt_kprintf("Received from server: %s\n", recv_buf);
}
rt_thread_mdelay(100);
}
}
static void udp_client_send_entry(void *paramter)
{
UDP_Sock *udpsock = (UDP_Sock*)paramter;
char send_buf[128] ;
int send_len;
while(1)
{
sendcnt ++;
rt_snprintf(send_buf,sizeof(send_buf),"Hello From ART-Pi Client%d",sendcnt);
send_len = sendto(udpsock->sock, send_buf, strlen(send_buf), 0,
(struct sockaddr*)&udpsock->server_addr, sizeof(udpsock->server_addr));
if(send_len > 0)
{
rt_kprintf("UDP send successful %d bytes send \n",send_len);
}
else {
rt_kprintf("UDP send failed\n");
}
rt_thread_mdelay(1500);
}
closesocket(udpsock->sock);
}
static UDP_Sock udpsock; // 改为静态变量,生命周期贯穿整个程序
void rth_udp_create(void)
{
rt_memset(&udpsock, 0, sizeof(udpsock));
udpsock.sock = socket(AF_INET, SOCK_DGRAM , 0 );
if(udpsock.sock < 0)
{
rt_kprintf("Socket creation failed\n");
return ;
}
udpsock.server_addr.sin_family = AF_INET;
udpsock.server_addr.sin_port = htons(SERVER_PORT);
udpsock.server_addr.sin_addr.s_addr = inet_addr(SERVERIP);
rth_udp_send = rt_thread_create("udp_send", udp_client_send_entry, &udpsock, 2048, 5, 100);
rth_upd_recv = rt_thread_create("udp_recv", udp_client_recv_entry, &udpsock, 2048, 6, 100);
rt_thread_startup(rth_upd_recv);
rt_thread_startup(rth_udp_send);
}
MSH_CMD_EXPORT(rth_udp_create,"udp test");
本实例使用的是UDP客户端,创建了两个线程,一个发送数据另一个接收数据。
#define SERVERIP "172.20.10.2"
代表服务器的IP地址,局域网测试,需要客户端和服务器连接同一个WiFi,并且客户端需要指定服务器的IP地址才可以正常通信。
测试结果如下:

客户端打包数据发给服务器之后,服务器又将数据传回客户端,一个非常简单的数据回环测试。