1. 前言
UDP是一种无连接的网络协议,它提供了一种简单的、不可靠的方式来进行数据传输。尽管它并不保证数据传输的完整性和顺序性,但UDP在某些场景下却具有独特的优势,例如在实时应用或网络游戏等领域中。
W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。在以太网应用中使用 W5100S/W5500 让用户可以更加方便地在设备之间实现远程连接和通信。
2. 协议简介
2.1 简述
UDP服务器是使用UDP协议进行通信的服务器。与TCP服务器不同,UDP服务器不需要建立连接就可以发送和接收数据报。这使得UDP服务器对于需要处理大量并发连接的应用程序更加高效。
2.2 优点
UDP服务器的优点主要包括:
- 效率:UDP不需要建立连接,因此减少了建立连接的开销,使得数据传输速度更快。
- 实时性:UDP适用于对实时性要求较高的应用,因为它能够更快速地传输数据。
- 广播和多播传输:UDP可以实现广播和多播传输,这意味着一个消息可以被发送到多个或所有目标。
- 简单性:UDP协议相对简单,易于理解和实现。
2.3 UDP Server的步骤
创建一个UDP服务器通常涉及以下步骤:
- 创建一个socket:这通常使用系统调用(如socket())完成。
- 绑定地址和端口:通过将socket与本地IP地址和端口号绑定,为服务器选择一个监听的位置。
- 开始监听:通过调用bind()函数将socket与本地地址和端口号绑定,然后使用recvfrom()函数开始监听来自客户端的数据报。
- 处理数据报:当接收到数据报时,服务器可以使用sendto()函数将响应发送回客户端。
- 关闭socket:最后,关闭socket以释放系统资源。
2.4 应用
UDP服务器被广泛应用于各种应用场景,以下是一些常见的应用:
- 实时通信:UDP因其快速传输数据的特性,广泛应用于实时通信,如实时股票交易系统、实时行情系统、实时报价系统等。
- 网络游戏:网络游戏对实时性和流畅性有很高的要求,UDP协议能够提供更快的速度和更少的延迟,因此在网络游戏中被广泛使用。
- 音视频传输:音视频传输对实时性和流畅性有很高的要求,UDP协议能够提供更快的速度和更少的延迟,因此在音视频传输中被广泛使用。
- 物联网:在物联网领域,UDP因其简单、快速和高效的特点,被广泛应用于各种设备的通信。
- 日志收集:许多服务器使用UDP来发送日志数据,因为UDP能够提供更快的传输速度,并且对数据包的顺序和完整性没有严格要求。
3. WIZnet以太网芯片
WIZnet 主流硬件协议栈以太网芯片参数对比
Model | Embedded Core | Host I/F | TX/RX Buffer | HW Socket | Network Performance |
---|---|---|---|---|---|
W5100S | TCP/IPv4, MAC & PHY | 8bit BUS, SPI | 16KB | 4 | Max.25Mbps |
W6100 | TCP/IPv4/IPv6, MAC & PHY | 8bit BUS, Fast SPI | 32KB | 8 | Max.25Mbps |
W5500 | TCP/IPv4, MAC & PHY | Fast SPI | 32KB | 8 | Max 15Mbps |
- W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
- W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
- W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。
4. UDP Sever回环测试
4.1 程序流程图
4.2 测试准备
软件:
- Visual Studio Code
- WIZnet UartTool
- SocketTester
硬件:
- W5100SIO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
- Micro USB 接口的数据线
- TTL 转 USB
- 网线
4.3 连接方式
- 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
- 通过TTL串口转USB,连接UART0 的默认引脚:
- RP2040 GPIO 0(UART0 TX) <----> USB_TTL_RX
- RP2040 GPIO 1(UART0 RX) <----> USB_TTL_TX
- 使用模块连接RP2040进行连线时
- RP2040 GPIO 16 <----> W5100S MISO
- RP2040 GPIO 17 <----> W5100S CS
- RP2040 GPIO 18 <----> W5100S SCK
- RP2040 GPIO 19 <----> W5100S MOSI
- RP2040 GPIO 20 <----> W5100S RST
- 通过网线直接连接PC网口(或:PC和设备都通过网线连接交换机或路由器LAN口)
4.4 相关代码
我们直接打开udp_server.c文件(路径:examples/udp_client/udp_client.c)看下具体实现:
可以看到这里是以DHCP模式配置网络信息的,因此在主控和W5100S初始化完成后,会进行DHCP初始化,然后增加一个定时器初始化,用来做DHCP过程中的计时以进行超时处理;接着进入DHCP配置网络信息,成功则直接进入循环调用回环测试函数,失败则用我们初始化的静态网络信息进行配置,然后再进入循环调用回环测试函数,如下所示:
/* Network information to be configured. */
wiz_NetInfo net_info = {
.mac = {0x00, 0x08, 0xdc, 0x1e, 0xed, 0x2e}, // Configured MAC address
.ip = {192, 168, 1, 10}, // Configured IP address
.sn = {255, 255, 255, 0}, // Configured subnet mask
.gw = {192, 168, 1, 1}, // Configured gateway
.dns = {8, 8, 8, 8}, // Configured domain address
.dhcp = NETINFO_DHCP}; // Configured dhcp model,NETINFO_DHCP:use dhcp; NETINFO_STATIC: use static ip.
wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {
0,
}; // Send and receive cachestatic uint8_t destip[4]={192, 168, 1, 2}; // udp destination ip
static uint8_t des_ip[4] = {192, 168, 1, 2}; // UDP IP address
static uint16_t des_port = 8080; // UDP port
static uint8_t dhcp_get_ip_flag = 0; // Define the DHCP acquisition flag
int main()
{
struct repeating_timer timer; // Define the timer structure
/* MCU init */
stdio_init_all(); // Initialize the main control peripheral
wizchip_initialize(); // Initialize the chip interface
/*dhcp init*/
DHCP_init(SOCKET_ID, ethernet_buf); // DHCP initialization
add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handler
printf("wiznet chip tcp server example.\r\n");
network_init(&net_info); // Configuring Network Information
print_network_information(&get_info); // Read back the configuration information and print it
while (true)
{
loopback_udpc(SOCKET_ID, ethernet_buf, des_ip, des_port); // udp loopback test
}
}
跳进回环测试里面看下其具体实现:该函数有这几个参数,socket端口号、数据收发缓存、目标IP地址、目标端口;可根据需要自行填入参数。其整体通过一个switch状态机轮询socket状态,根据不同进行相应的处理,依次完成了初始化、打开socket端口、收到数据后回传的操作;其中本地端口直接在函数内初始化了。如下所示:
/**
* @brief udp client loopback test
* @param sn: socket number
* @param buf: Data sending and receiving cache
* @param destip: Destination IP address
* @param destport: Destination port
* @return value for SOCK_ERRORs,return 1:no error
*/
int32_t loopback_udpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport)
{
int32_t ret;
uint16_t size = 0, sentsize=0;
static uint16_t any_port = 50000;
switch(getSn_SR(sn))
{
case SOCK_UDP :
// sendto(sn, "test", 4, destip, destport);
if((size = getSn_RX_RSR(sn)) > 0)
{
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);
buf[ret]=0x00;
printf("recv form[%d.%d.%d.%d][%d]: %s\n", destip[0],destip[1],destip[2],destip[3],destport,buf);
if(ret <= 0)
{
#ifdef _LOOPBACK_DEBUG_
printf("%d: recvfrom error. %ld\r\n",sn,ret);
#endif
return ret;
}
size = (uint16_t) ret;
sentsize = 0;
while(sentsize != size)
{
ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);
if(ret < 0)
{
#ifdef _LOOPBACK_DEBUG_
printf("%d: sendto error. %ld\r\n",sn,ret);
#endif
return ret;
}
sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
}
break;
case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
//printf("%d:UDP loopback start\r\n",sn);
#endif
if((ret = socket(sn, Sn_MR_UDP, any_port, 0x00)) != sn)
return ret;
#ifdef _LOOPBACK_DEBUG_
printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, any_port);
#endif
break;
default :
break;
}
return 1;
}
4.5 测试现象
硬件连接无误后,编译烧录程序(具体可参考第一章节),打开WIZ UartTool,选择对应的COM口,填入参数:波特率115200,8位数据位,1位停止位,无校验位,无流控,填完参数后点击open打开,观察串口打印的信息以获取设备运行状态;打开SocketTester,在左列填入相对应的参数,UDP 模式,本地IP填写电脑的IP,本地端口的填写可随机,但尽量不要使用特殊端口;然后根据设备通过DHCP获得的IP等信息,在下边远程IP地址栏填入设备IP和设备端口,因为UDP是无连接的,直接发送信息后可以看到回传现象,如下图所示:
5. 注意事项
- UDP是无连接的,服务端发送消息后客户端收到才能看到现象
- 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:
- 在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500;
- 在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。
6. 相关链接
WIZnet官网
WIZnet官方库链接
本章例程链接文章来源:https://www.toymoban.com/news/detail-734218.html
想了解更多,评论留言哦!文章来源地址https://www.toymoban.com/news/detail-734218.html
到了这里,关于六、W5100S/W5500+RP2040树莓派Pico<UDP Server数据回环测试>的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!