减肥产品网站模板,十大购物网站,家乡网站设计目的,软件开发专业用什么笔记本文章目录 1. 前言2. 相关简介2.1 简述2.2 优点2.3 应用 3. WIZnet以太网芯片4. UDP 组播回环测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 UDP组播是一种基于UDP协议的通信方式#xff0c;它允许一台计算机通过发送单… 文章目录 1. 前言2. 相关简介2.1 简述2.2 优点2.3 应用 3. WIZnet以太网芯片4. UDP 组播回环测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 UDP组播是一种基于UDP协议的通信方式它允许一台计算机通过发送单个UDP数据包来同时向多个目标发送信息。这种通信方式在需要高效、实时的数据传输的应用中非常有用比如视频直播、在线游戏等。   本章节将进行UDP组播回环测试。 W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器同时也是一颗工业级以太网控制芯片。在以太网应用中使用 W5100S/W5500 让用户可以更加方便地在设备之间实现远程连接和通信。 
2. 相关简介 
2.1 简述 UDP组播是一种基于UDP协议的通信方式也称为多播。它允许一台计算机通过发送单个UDP数据包来同时向多个目标发送信息而不需要像单播模式那样对每个目标单独发送数据包。 组播地址是一种特殊的IP地址范围从224.0.0.0到239.255.255.255它们被划分为不同的类型包括局部链接多播地址、预留多播地址和管理权限多播地址。使用组播时需要在发送方和接收方之间建立对等关系并使用特定的组播协议来确保数据的传输可靠性和顺序性。 组播MAC地址为了在本地物理网络上实现组播信息的正确传输需要在链路层使用组播MAC地址。以太网传输IPv4单播报文的时候目的MAC地址使用的是接收者的MAC地址。但是在传输组播数据时其目的地不再是一个具体的接收者而是一个成员不确定的组所以要使用IPv4组播MAC地址即IPv4组播地址映射到链路层中的地址。IANA规定IPv4组播MAC地址的高24位为0x01005e第25位为0低23位为IPv4组播地址的低23位映射关系如下图所示 在组播中发送方将数据包发送到特定的组播组地址这个地址不属于任何特定的一台计算机而是属于一组计算机。只有订阅了这个组播组地址的计算机才能接收到这个数据包。这种通信方式可以有效地节省网络带宽因为发送方只需要发送一个数据包而不是对每个接收方都发送一个数据包。 相比之下单播模式是点对点的通信方式每个发送方都需要单独向接收方发送数据包。在某些情况下如果需要向多个接收方发送相同的数据包那么单播模式会浪费大量的网络带宽。 总的来说UDP组播是一种非常高效的通信方式适用于需要向多个接收者同时发送相同数据的场景如视频直播、在线游戏、多用户协作等。 
2.2 优点 
节省带宽由于UDP组播允许发送方只需发送一个数据包就可以到达多个接收方因此可以显著节省带宽特别是在接收方较多的情况下。高效传输相对于单播模式UDP组播可以在网络中快速传输数据包因为它可以在一个网络路径上同时发送到多个接收方。实时性UDP组播适用于实时通信因为它可以立即将数据包发送到所有订阅了组播组的接收方而无需等待接收方确认。 可扩展性通过使用组播地址可以实现一对多的通信适用于大规模的数据分发和实时应用 
2.3 应用 
多媒体广播多媒体广播应用如电视和电台广播通过UDP组播将音频和视频数据传输到多个接收者。多用户游戏多用户游戏通过UDP组播将游戏数据传输到多个客户端实现多人在线游戏。实时协作像在线会议这样的实时协作应用可以使用UDP组播将音频、视频和其他协作数据传输到所有参会者。分布式系统UDP组播可以用于分布式系统将数据从一个节点发送到其他节点实现数据同步和状态报告等功能。网络监控网络监控应用可以通过UDP组播将监控数据发送到多个接收者例如实时流量监控、网络安全监控等。视频会议多人在线的视频会议每个用户都可以共享到音频、视频数据。 
3. WIZnet以太网芯片 
WIZnet 主流硬件协议栈以太网芯片参数对比 
ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork PerformanceW5100STCP/IPv4 MAC  PHY8bit BUS, SPI16KB4Max 25MbpsW6100TCP/IPv4/IPv6, MAC  PHY8bit BUS, Fast SPI32KB8Max 25MbpsW5500TCP/IPv4, MAC  PHYFast SPI32KB8Max 15Mbps 
W5100S/W6100 支持 8bit数据总线接口网络传输速度会优于W5500。W6100 支持IPV6与W5100S 硬件兼容若已使用W5100S的用户需要支持IPv6可以Pin to Pin兼容。W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存 
4. UDP 组播回环测试 
4.1 程序流程图 4.2 测试准备 
软件 
Visual Studio CodeWIZnet UartToolSocketTester 
硬件 
W5100SIO模块  RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板Micro USB 接口的数据线TTL 转 USB网线 
4.3 连接方式 
通过数据线连接PC的USB口主要用于烧录程序也可以虚拟出串口使用通过TTL串口转USB连接UART0 的默认引脚 RP2040 GPIO 0UART0 TX ---- USB_TTL_RXRP2040 GPIO 1UART0 RX ---- USB_TTL_TX 使用模块连接RP2040进行连线时 RP2040 GPIO 16 ---- W5100S MISORP2040 GPIO 17 ---- W5100S CSRP2040 GPIO 18 ---- W5100S SCKRP2040 GPIO 19 ---- W5100S MOSIRP2040 GPIO 20 ---- W5100S RST 通过网线直接连接PC网口或PC和设备都通过网线连接交换机或路由器LAN口 
4.4 相关代码 我们直接打开udp_multicast.c文件路径examples/udp_multicast/udp_multicast.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 cache
static uint8_t multicast_mac[6] {0x01,0x00,0x5e,0x01,0x01,0x0b};   // multicast mac address
static uint8_t multicast_ip[4]   {224, 1, 1, 11};  // multicast ip address
static uint16_t multicast_port   30000; // multicast port
static uint8_t dhcp_get_ip_flag  0;         // Define the DHCP acquisition flagint main()                                                          
{   struct repeating_timer timer; // Define the timer structure/* MCU init */stdio_init_all();     // Initialize the main control peripheralwizchip_initialize(); // Initialize the chip interface/*dhcp init*/DHCP_init(SOCKET_ID, ethernet_buf);                                   // DHCP initializationadd_repeating_timer_ms(1000, repeating_timer_callback, NULL, timer); // Add DHCP 1s Tick Timer handlerprintf(wiznet chip tcp server example.\r\n);network_init(net_info); // Configuring Network Informationprint_network_information(get_info);   // Read back the configuration information and print itwhile(true){multicast_loopback(SOCKET_ID, ethernet_buf, multicast_mac, multicast_ip, multicast_port);   // Multicast loopback test}
}跳进回环测试里面看下其具体实现 该函数有这几个参数socket端口号、数据收发缓存、组播MAC地址、组播IP地址、组播端口根据实际需要填入参数。其整体通过一个switch状态机轮询socket状态根据不同进行相应的处理依次完成了初始化、打开socket端口、收到数据后回传的操作 其中本地端口直接在函数内初始化了。如下所示 
/*** brief   UDP Multicast loopback test* param   sn: Socket Number* param   buf: Data sending and receiving cache* param   multicast_mac: Multicast MAC address* param   multicast_ip:  Multicast IP address* param   multicast_port:Multicast port* return  value for SOCK_ERRORs,return 1:no error
*/
int32_t multicast_loopback(uint8_t sn, uint8_t* buf, uint8_t* multicast_mac, uint8_t* multicast_ip, uint16_t multicast_port)
{int32_t  ret;uint16_t size, sentsize;uint8_t destip[4];uint16_t destport, port50000;switch(getSn_SR(sn)){case SOCK_UDP :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 from [%d.%d.%d.%d][%d]: %s\r\n,destip[0],destip[1],destip[2],destip[3],destport,buf);if(ret  0){
#ifdef _MULTICAST_DEBUG_printf(%d: recvfrom error. %ld\r\n,sn,ret);
#endifreturn ret;}size  (uint16_t) ret;sentsize  0;while(sentsize ! size){ret  sendto(sn, bufsentsize, size-sentsize, destip, destport);if(ret  0){
#ifdef _MULTICAST_DEBUG_printf(%d: sendto error. %ld\r\n,sn,ret);
#endifreturn ret;}sentsize  ret; // Dont care SOCKERR_BUSY, because it is zero.}}break;case SOCK_CLOSED:
#ifdef _MULTICAST_DEBUG_printf(%d:Multicast Loopback start\r\n,sn);
#endifsetSn_DIPR(0, multicast_ip);setSn_DPORT(0, multicast_port);setSn_DHAR(0, multicast_mac);if((ret  socket(sn, Sn_MR_UDP, port, Sn_MR_MULTI)) ! sn)return ret;
#ifdef _MULTICAST_DEBUG_printf(%d:Opened, UDP Multicast Socket\r\n, sn);printf(%d:Multicast Group IP - %d.%d.%d.%d\r\n, sn, multicast_ip[0], multicast_ip[1], multicast_ip[2], multicast_ip[3]);printf(%d:Multicast Group Port - %d\r\n, sn, multicast_port);
#endifbreak;default :break;}return 1;
}4.5 测试现象 
 硬件连接无误后编译烧录程序具体可参考第一章节打开WIZ UartTool选择对应的COM口填入参数波特率1152008位数据位1位停止位无校验位无流控填完参数后点击open打开观察串口打印的信息以获取设备运行状态打开网络调试工具SocketTester在左列填入参数选择UDP模式本地IP填入电脑IP端口随机但尽量不要使用特殊端口下边的远程IP和端口填入对应的组播IP和端口然后直接发送信息可以看到数据成功发送后串口这边收到的来自组播成员192.168.1.2:8080的数据也即设备作为组播成员成功收到了电脑发给播组的数据如下图所示 为了更直接的了解其交互过程这里通过wireshark抓包工具抓包分析每次向播组发送数据后设备作为播组成员收到后都进行了回传如下图所示  
5. 注意事项 
组播MAC地址和组播IP地址的映射关系如果想用WIZnet的W5500来实现本章的示例我们只需修改两个地方即可 在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件将_WIZCHIP_ 宏定义修改为W5500。  在library下找到CMakeLists.txt文件将COMPILE_SEL设置为ON即可OFF为W5100SON为W5500。 6. 相关链接 WIZnet官网 WIZnet官方库链接 本章例程链接