全部例程

W55MH32 UDP组播通讯测试

W55MH32

更新于 2026年9月23日

本篇总结

使用 W55MH32 实现 UDP 组播通信回环测试。

🔑 KEIL MDK、UART调试、硬件TOE引擎、UDP组播、DHCP

硬件平台:本例程基于 W55MH32L-EVB 开发板运行。

采购推荐:点击前往 WIZnet 官方淘宝店铺 选购 W55MH32L-EVB

本示例演示 W55MH32 的片上硬件 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

W55MH32 的优势

W55MH32 片内集成了完整的硬件 TCP/IP 协议栈,组播的 IGMP 报文由 TOE 硬件自动处理。用户只需在打开 Socket 前设置组播目标信息(IP/端口/MAC),并以 Sn_MR_MULTI 标志调用 socket(),硬件会自动发送 IGMP 报文加入组播组,无需软件实现 IGMP 协议。

硬件连接与拓扑

请注意:

测试需要 PC 端和 W55MH32 处于同一网段,且路由器需支持 IGMP 协议。

  1. Micro USB 线连接 DEBUG USB 口到 PC(供电 + 调试串口)
  2. 网线连接开发板 RJ45 网口 到路由器 LAN 口
┌─────────────────────────────────┐
│ 路由器(DHCP Server) │
│ 192.168.1.1 │
└────┬──────────────────┬───────────┘
│ │
┌────┴──────┐ ┌────┴──────┐
│ W55MH32 │ │ PC │
│UDP:5000 mc│ │SocketTester│
│ IP: DHCP │ │ IP: DHCP │
└───────────┘ └───────────┘
↑ ↑
DEBUG USB ──→ WIZ UartTool
网络拓扑:开发板与 PC 在同一局域网内,通过路由器互通

工程结构

工程位于 SDK 内 1.SDK\ModuleDemo\WZTOE\UDP组播\,核心文件如下:

UDP组播/
├── Project/
│   └── Project.uvprojx       ← Keil 工程文件
└── USER/
    ├── main.c                ← 初始化 + 主循环
    ├── Loopback/
    │   ├── loopback.c        ← UDP 组播状态机核心
    │   └── loopback.h
    ├── wiz_interface/
    │   ├── wiz_interface.c   ← DHCP / PHY 检测 / 网络初始化
    │   └── wiz_interface.h
    └── uart/
        ├── bsp_uart.c        ← 调试串口 + printf 重定向
        └── bsp_uart.h

步骤1:主循环调用

文件: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/Loopback/loopback.c | 函数:udp_multicast() — 基于 WIZnet Socket 状态机,SOCK_CLOSED 时设置组播目标信息并以 Sn_MR_MULTI 标志打开 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 = 50000;

    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) return ret;
            size = (uint16_t)ret;
            sentsize = 0;
            while (sentsize != size)
            {
                ret = sendto(sn, buf + sentsize, size - sentsize, destip, destport);
                if (ret < 0) return ret;
                sentsize += ret;
            }
        }
        break;
    case SOCK_CLOSED:
        /* 设置组播目标信息 */
        setSn_DIPR(sn, multicast_ip);       // 组播IP地址
        setSn_DPORT(sn, multicast_port);    // 组播端口号
        setSn_DHAR(sn, multicast_mac);      // 组播MAC地址
        /* 以 Sn_MR_MULTI 标志打开UDP Socket,加入组播组 */
        if ((ret = socket(sn, Sn_MR_UDP, port, Sn_MR_MULTI)) != sn)
            return ret;
        break;
    default:
        break;
    }
    return 1;
}

状态机关键 API:setSn_DIPR() / setSn_DPORT() / setSn_DHAR() 设置组播目标信息,socket() 以 Sn_MR_MULTI 标志打开 Socket 加入组播组,recvfrom() 接收数据并获取来源地址,sendto() 向来源地址发回数据。

组播与普通 UDP 的关键区别

1. 打开 Socket 前必须设置组播目标信息(setSn_DIPR/setSn_DPORT/setSn_DHAR);2. socket() 函数第4个参数必须为 Sn_MR_MULTI,W55MH32 硬件会自动发送 IGMP 报文加入组播组。

如果你想自定义

  • 改组播地址 → 修改 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),观察开发板串口输出。

UDP 组播初始化WIZ UartTool 串口输出 — UDP 组播初始化(组播组 224.1.1.11:30000)

然后打开支持 UDP 组播功能的网络调试工具,设置监听组播地址和端口,向组播组发送消息。W55MH32 串口会打印接收到的消息,同时调试工具的组播接收区域会收到回环数据。

UDP 调试工具发送 "Hello W55MH32" + WIZ UartTool 串口接收 — 组播回环测试

测试前提

  • PC 端和 W55MH32 需处于同一网段
  • 连接的路由器需支持 IGMP 协议
  • 网络调试工具必须支持加入组播功能,否则收不到回环数据

常见问题

Q: 组播和广播有什么区别

广播发送给网段内所有设备,无法选择性接收;组播只发送给加入了特定组播组的设备,具有选择性。广播不能跨网段,组播可以通过 IGMP 协议跨网段传输。组播地址范围 224.0.0.0~239.255.255.255,广播地址是 255.255.255.255 或网段.255。

Q: 为什么收不到组播回环数据

排查步骤:1. 确认路由器支持 IGMP 协议;2. 确认网络调试工具已加入组播组(设置监听组播地址);3. 检查组播地址和端口是否一致;4. 确认 socket() 函数添加了 Sn_MR_MULTI 标志。

Q: Sn_MR_MULTI 标志的作用是什么

Sn_MR_MULTI 是 socket() 函数的标志位参数,设置后 W55MH32 硬件会自动通过 IGMP 协议向路由器发送加入组播组的请求。打开 Socket 前需要先通过 setSn_DIPR/setSn_DPORT/setSn_DHAR 设置组播目标信息。

Q: 组播MAC地址如何确定

组播MAC地址由组播IP地址映射而来。MAC地址前3字节固定为 01:00:5E,第4字节取组播IP第2字节的低5位,第5、6字节取组播IP第3、4字节。例如组播IP 224.1.1.11 对应MAC为 01:00:5E:01:01:0B。

Q: 组播能跨网段通信吗

可以。组播通过 IGMP 协议管理组成员关系,路由器会维护组播组信息并跨网段转发组播数据。但要求路径上的所有路由器都支持 IGMP 协议和组播路由。广播则只能在同一网段内传播。

总结

本文基于 W55MH32 硬件 TCP/IP 协议栈实现了 UDP 组播通信:

  • 组播原理:一对多通信,发送者只发一份数据,网络设备负责复制分发到组成员
  • 地址范围:IPv4 组播地址 224.0.0.0~239.255.255.255
  • 与普通 UDP 区别:打开 Socket 前设置组播目标信息(IP/端口/MAC),socket() 添加 Sn_MR_MULTI 标志
  • IGMP 协议:设备通过 IGMP Membership Report 报文加入组播组,W55MH32 硬件自动处理
  • 测试要求:需路由器支持 IGMP,网络调试工具需支持组播功能

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5 配套开发板

Andy

W5500 技术支持专家