本篇总结
使用 W6300 实现 UDP 组播通信回环测试。
🔑 MH2457、QSPI、UART调试、硬件TOE引擎、UDP组播、DHCP
硬件平台 :本例程基于 W6300-EVB-M4 开发板运行。
采购推荐 :点击前往 WIZnet 官方淘宝店铺 选购 W6300-EVB-M4 开发板
本示例演示 W6300 的片上硬件 TCP/IP 协议栈(TOE)实现 UDP 组播通信。开发板通过设置组播目标信息(IP/端口/MAC)并以 Sn_MR_MULTI 标志打开 Socket 加入组播组,实现组播数据的收发回环测试。
前置工具准备 开始本例程前,请确认以下工具已安装:
WIZ UartTool V1.0 :串口调试工具:点击下载
SocketTester :网络调试工具(需支持 UDP 组播功能):点击下载
UDP 组播简介
UDP 组播是一种允许数据从一个源同时发送到多个目标设备的高效传输方式,只有加入相应组播组的接收者才能接收数据。它基于 UDP 协议,继承无连接、低开销的特性,发送者只需发送一份数据,由网络设备负责复制分发,从而节省带宽。组播组成员可动态加入或离开,无需通知发送者,但 UDP 组播不保证数据可靠传输。设备加入组播组时使用 IGMP(Internet Group Management Protocol)协议,IPv4 的组播地址范围为 224.0.0.0 到 239.255.255.255 。
一对多通信: 发送者只发一份数据,网络设备负责复制分发到组成员
动态加入/离开: 组播组成员可动态加入或离开,无需通知发送者
IGMP 协议: 设备通过 IGMP Membership Report 报文加入组播组
地址范围: IPv4 组播地址 224.0.0.0~239.255.255.255
W6300 的优势
W6300 片内集成了完整的硬件双协议栈 TCP/IP,组播的 IGMP 报文由 TOE 硬件自动处理。用户只需在打开 Socket 前设置组播目标信息(IP/端口/MAC),并以 Sn_MR_MULTI 标志打开 Socket,硬件会自动发送 IGMP 报文加入组播组,无需软件实现 IGMP 协议。W6300 支持 IPv4 / IPv6 双栈,组播 Socket 同样可按协议栈模式选择。
硬件连接与拓扑
请注意:
测试需要 PC 端和 W6300 处于同一网段,且路由器需支持 IGMP 协议。
Micro USB 线连接 DEBUG USB 口到 PC(供电 + 调试串口)
网线连接开发板 RJ45 网口 到路由器 LAN 口
确保 W6300 与 MH2457 之间的 QSPI 连线正确(CSn、SCK、DATA0~DATA3)
┌─────────────────────────────────┐
│ 路由器(DHCP Server) │
│ 192.168.1.1 │
└────┬──────────────────┬───────────┘
│ │
┌────┴──────┐ ┌────┴──────┐
│ W6300 │ │ PC │
│UDP:5000 mc│ │SocketTester│
│ IP: DHCP │ │ IP: DHCP │
└────┬──────┘ └───────────┘
│ QSPI ↑
┌────┴──────┐ DEBUG USB
│ MH2457 │──────────→ WIZ UartTool
│ MCU │
└───────────┘
网络拓扑:开发板与 PC 在同一局域网内,通过路由器互通,MH2457 通过 QSPI 驱动 W6300
工程结构
工程核心文件如下:
Project/
├── main.c ← 系统入口:串口、GPIO、QSPI 初始化 + user_run()
└── USER/
├── user_main.c/h ← 网络地址定义 + 组播参数 + user_run() 主流程
├── udp_multicast/
│ ├── udp_multicast.c ← udp_multicast() 状态机核心
│ └── udp_multicast.h
├── wiz_platform.c/h ← 平台适配:debug_usart_init、wizchip_gpio_init、hspi_init
├── wiz_interface.c/h ← W6300 驱动接口:wizchip_initialize、network_init、PHY 检测
└── wizchip_conf.h ← WIZnet 配置与 wiz_NetInfo 定义
步骤1:主循环调用
文件:USER/user_main.c。在主循环中调用 udp_multicast() 函数,传入 Socket 号、网络缓冲区、组播 MAC、组播 IP 和组播端口。
while (1)
{
udp_multicast(SOCKET_ID, ethernet_buf,
Multicast_mac, Multicast_IP, Multicast_port);
}
主循环不断调用 udp_multicast(),该函数内部基于 Socket 状态机运行:SOCK_CLOSED 时打开组播 Socket,SOCK_UDP 时接收组播数据并原样发回。
步骤2:组播状态机核心逻辑 文件:USER/udp_multicast/udp_multicast.c | 函数:udp_multicast() — 基于 WIZnet Socket 状态机,SOCK_CLOSED 时设置组播目标信息并打开组播 Socket 加入组播组,SOCK_UDP 时接收数据并原样发回。
int32_t udp_multicast(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, port = multicast_port;
uint8_t addr_len;
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, &addr_len);
if (ret <= 0) return ret;
print_recv_log_ipv4(destip, destport, buf, (uint16_t)ret);
size = (uint16_t)ret;
sentsize = 0;
while (sentsize != size)
{
ret = sendto(sn, buf + sentsize, size - sentsize, destip, destport, 4);
if (ret < 0) return ret;
sentsize += ret;
}
}
break;
case SOCK_CLOSED:
close(sn);
/* 设置组播目标信息 */
setSn_DHAR(sn, multicast_mac); // 组播MAC地址
setSn_DIPR(sn, multicast_ip); // 组播IP地址
setSn_DPORT(sn, multicast_port); // 组播端口号
setSn_MR(sn, Sn_MR_UDP | Sn_MR_MULTI);
setSn_PORTR(sn, port);
setSn_DHAR(sn, multicast_mac);
setSn_DIPR(sn, multicast_ip);
setSn_DPORT(sn, multicast_port);
setSn_CR(sn, Sn_CR_OPEN);
while (getSn_CR(sn));
if (getSn_SR(sn) != SOCK_UDP)
return SOCKERR_SOCKINIT;
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);
break;
default:
break;
}
return 1;
}
组播与普通 UDP 的关键区别
1. 打开 Socket 前必须设置组播目标信息(setSn_DHAR/setSn_DIPR/setSn_DPORT);2. Socket 模式必须包含 Sn_MR_MULTI 标志,W6300 硬件会自动发送 IGMP 报文加入组播组;3. W6300 需要通过 setSn_MR + Sn_CR_OPEN 手动打开 Socket,而不是直接调用 socket()。
如果你想自定义
改组播地址 → 修改 user_main.c 中 Multicast_IP 的值(范围 224.0.0.0~239.255.255.255)
改组播端口 → 修改 Multicast_port 的值
组播 MAC 地址 → 由组播 IP 映射而来,前3字节固定为 01:00:5E,第4字节取组播IP第2字节的低5位,第5、6字节取组播IP第3、4字节
运行验证
烧录例程运行后,首先进行 PHY 链路检测,然后通过 DHCP 获取网络地址,最后进入 UDP 组播回环测试模式。打开 WIZ UartTool V1.0 ,连接 DEBUG USB 对应 COM 口(115200 / 8N1),观察开发板串口输出:
MH2457 W6300 QSPI example start
W6300 UDP Multicast example
PHY link
The current Mbtis speed : 100Mbps
The current Duplex Mode : Full-Duplex
DHCP running
DHCP success!
====================================================================================================
W6300 network configuration : DHCP
MAC : 00:08:DC:12:34:56
IP : 192.168.1.8
Subnet Mask : 255.255.255.0
Gateway : 192.168.1.1
DNS : 192.168.1.1
====================================================================================================
1:Multicast Loopback start
1:Opened, UDP Multicast Socket
1:Multicast Group IP - 239.0.0.1
1:Multicast Group Port - 5000
然后打开支持 UDP 组播功能的网络调试工具,设置监听组播地址(239.0.0.1)和端口(5000),向组播组发送消息。W6300 串口会打印接收到的消息,同时调试工具的组播接收区域会收到回环数据。
WIZ UartTool 串口输出 — UDP 组播初始化(组播组 239.0.0.1:5000) 测试UDP 调试工具发送 + WIZ UartTool 串口接收 — 组播回环测试
测试前提
PC 端和 W6300 需处于同一网段
连接的路由器需支持 IGMP 协议
网络调试工具必须支持加入组播功能,否则收不到回环数据
常见问题
Q: 组播和广播有什么区别
广播发送给网段内所有设备,无法选择性接收;组播只发送给加入了特定组播组的设备,具有选择性。广播不能跨网段,组播可以通过 IGMP 协议跨网段传输。组播地址范围 224.0.0.0~239.255.255.255,广播地址是 255.255.255.255 或网段.255。
Q: 为什么收不到组播回环数据
排查步骤:1. 确认路由器支持 IGMP 协议;2. 确认网络调试工具已加入组播组(设置监听组播地址);3. 检查组播地址和端口是否一致;4. 确认 Sn_MR 寄存器已设置 Sn_MR_MULTI 标志。
Q: 组播MAC地址如何确定
组播MAC地址由组播IP地址映射而来。MAC地址前3字节固定为 01:00:5E,第4字节取组播IP第2字节的低5位,第5、6字节取组播IP第3、4字节。例如组播IP 239.0.0.1 对应MAC为 01:00:5E:00:00:01。
Q: 组播能跨网段通信吗
可以。组播通过 IGMP 协议管理组成员关系,路由器会维护组播组信息并跨网段转发组播数据。但要求路径上的所有路由器都支持 IGMP 协议和组播路由。广播则只能在同一网段内传播。
总结
本文基于 W6300 硬件 TCP/IP 协议栈实现了 UDP 组播通信:
组播原理: 一对多通信,发送者只发一份数据,网络设备负责复制分发到组成员
地址范围: IPv4 组播地址 224.0.0.0~239.255.255.255
与普通 UDP 区别: 打开 Socket 前设置组播目标信息(IP/端口/MAC),Socket 模式包含 Sn_MR_MULTI 标志
IGMP 协议: 设备通过 IGMP Membership Report 报文加入组播组,W6300 硬件自动处理
测试要求: 需路由器支持 IGMP,网络调试工具需支持组播功能