全部例程

W55MH32网络唤醒设备

W55MH32

更新于 2026年9月30日

本篇总结

在 W55MH32 上实现网络唤醒(Wake-on-LAN)功能,通过 UDP Socket 监听魔术包并触发中断,实现设备唤醒。

🔑 KEIL MDK、UART调试、硬件TOE引擎、WOL、DHCP

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

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

本示例演示如何在 W55MH32 上实现网络唤醒(Wake-on-LAN)功能。该例程用到的其他网络协议(例如 DHCP),请参考相关章节。有关 W55MH32 的初始化过程,请参考 Network Install 章节,这里不再赘述。

前置工具准备

开始本例程前,请确认以下工具已安装:

WOL 协议简介

WOL 即网络唤醒(Wake-on-LAN),是一种用于通过网络远程唤醒计算机的网络标准协议。它允许通过发送特定的网络数据包(即"魔术包",Magic Packet)来唤醒处于休眠或关机状态的设备。

WOL 的特点:

  • 简单性:魔术包格式非常简单且固定,由 102 个字节组成,前 6 个字节固定为 0xFF,后续是目标设备 MAC 地址重复 16 次
  • 设备待机唤醒:设备在不使用时进入低功耗状态,需要时通过接收魔术包快速恢复正常运行
  • 广播机制:魔术包通常通过 UDP 广播发送,即使设备 IP 未知或存在多台设备,也能通过广播包找到目标设备
  • 安全性高:WOL 基于 MAC 地址识别目标设备,只有当魔术包中的 MAC 与网卡自身 MAC 匹配时,设备才会被唤醒

WOL 应用场景

① 远程唤醒嵌入式设备:工业设备和智能家居设备在待机状态时通过网络唤醒恢复工作;② 智能网关与家庭自动化:通过魔术包唤醒智能家居网关设备实现控制和管理;③ 网络设备批量唤醒:管理员通过 WOL 技术批量唤醒多个设备进行维护和升级。

WOL 协议基本工作流程

  1. 开启 WOL 功能:W55MH32 首先需要开启 WOL 功能并开启 WOL 唤醒中断
  2. 开启 UDP Socket:W55MH32 需要开启一个 UDP Socket 监听端口,用于接收来自网络的魔术包
  3. 发送魔术包:当需要唤醒设备时,通过广播发送魔术包
  4. 唤醒操作:如果魔术包中的 MAC 地址与自身匹配,W55MH32 将触发魔术包中断,检测到中断后可以恢复到活动状态

硬件连接与拓扑

请注意:

测试实例需要 PC 端和 W55MH32 处于同一网段。

  1. Micro USB 线连接 DEBUG USB 口到 PC(供电 + 调试串口)
  2. 网线连接开发板 RJ45 网口 到路由器 LAN 口
┌─────────────────────────────────┐
│ 路由器(DHCP Server) │
│ 192.168.1.1 │
└────┬──────────────────┬───────────┘
│ │
┌────┴──────┐ ┌────┴──────┐
│ W55MH32 │ │ PC │
│ WOL 监听 │ │SocketTester│
│ IP: DHCP │ │ 发魔术包 │
│ port:9000 │ │ │
└───────────┘ └───────────┘
↑ ↑
DEBUG USB ──→ WIZ UartTool
网络拓扑:PC 通过 SocketTester 广播发送魔术包,W55MH32 监听并触发唤醒

工程结构

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

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

步骤1:主循环运行 WOL 状态机

文件:USER/main.c

uint16_t local_port = 9000;

while (1)
{
    wol_run(SOCKET_ID, ethernet_buf, local_port);
}

三个传参分别为:Socket ID、Socket 缓存数组、本地监听端口号(示例为 9000)。主循环不断调用状态机函数,等待魔术包到达。

步骤2:WOL 状态机

wol_run() 函数通过不断检查 Socket 状态执行对应操作:SOCK_CLOSED 时创建 UDP Socket 并开启 WOL 功能及中断;SOCK_UDP 时监听中断寄存器,当 IR 寄存器的 MP 位(0x10)生效时判定收到魔术包。

文件:USER/wol.c | 函数:wol_run()

void wol_run(uint8_t sn, uint8_t *buf, uint16_t local_port)
{
    switch (getSn_SR(sn))
    {
    case SOCK_UDP:
        if (getSn_IR(sn) & Sn_IR_RECV)
        {
            setSn_IR(sn, Sn_IR_RECV);
        }
        if (getIR() & IR_MP) // Received WOL Magic packet based on UDP.
        {
            printf("get wake on line\r\n");
            setIR(0x10);
        }
        break;
    case SOCK_CLOSED:
        setIMR(IM_IR4); // Open WOL magic pack interrupt
        setMR(MR_WOL);  // Receive WOL packets

        socket(sn, Sn_MR_UDP, local_port, 0);
        printf("%d:Opened, UDP WOL, port [%d]\r\n", sn, local_port);
        break;
    }
}

关键点:SOCK_CLOSED 时通过 setIMR(IM_IR4) 开启 WOL 魔术包中断,通过 setMR(MR_WOL) 使能 WOL 接收模式,再以 UDP 模式打开 Socket 监听 9000 端口。SOCK_UDP 时清接收中断标志,检测 IR_MP(0x10)位——该位由硬件在收到魔术包时置位,检测到即打印 get wake on line,并通过 setIR(0x10) 清中断。

魔术包格式

魔术包固定 102 字节:前 6 字节为 FF FF FF FF FF FF,之后是目标 MAC 地址重复 16 次(16 × 6 = 96 字节)。W55MH32 硬件自动解析魔术包并置位 IR 寄存器的 MP 位,无需软件实现解析。

如果你想自定义

  • 改监听端口 → 修改 main.c 中 local_port 的值
  • 唤醒后执行动作 → 在 printf("get wake on line") 后添加业务逻辑代码
  • 改用其他 Socket 编号 → 修改 SOCKET_ID 宏(W55MH32 TOE 支持 0-7 共 8 个 Socket)

运行验证

打开 WIZ UartTool V1.0,连接 DEBUG USB 对应 COM 口(115200 / 8N1)。烧录例程运行后,首先进行 PHY 链路检测和 DHCP 获取网络地址,然后打开 UDP WOL Socket 并监听 9000 端口。预期串口输出如下:

W55MH32 WOL example
PHY link
The current Mbtis speed : 100Mbps
The current Duplex Mode : Full-Duplex
DHCP running
DHCP success!
====================================================================================================
 W55MH32 network configuration : DHCP

 MAC         : 00:08:DC:00:0E:9A
 IP          : 192.168.1.6
 Subnet Mask : 255.255.255.0
 Gateway     : 192.168.1.1
 DNS         : 192.168.1.1
====================================================================================================

0:Opened, UDP WOL, port [9000]

然后在 PC 端打开 SocketTester,设置 UDP 模式,目标 IP 为 W55MH32 的 IP(192.168.1.6),目标端口为 9000,发送 HEX 格式的魔术包数据。

发送魔术包注意事项

使用 SocketTester 发送 HEX 格式数据时,需勾选 Enable $# command 选项,在每个数据前面加上 $ 符号,注意不能有空格——空格会被转换为 0x20。若使用其他网络调试助手,直接以 HEX 格式发送即可。

魔术包内容为:FF FF FF FF FF FF + 目标 MAC 地址重复 16 次。W55MH32 收到魔术包后,串口会打印 get wake on line,表示成功接收到魔术包并触发唤醒事件。

SocketTester 发送 WOL 魔术包 — HEX 格式数据
WIZ UartTool 串口输出 — WOL 唤醒成功,打印 "get wake on line"

常见问题

Q: 魔术包为什么是 102 字节

魔术包 = 6 字节前导(FF FF FF FF FF FF)+ 16 次 MAC 地址重复(16 × 6 = 96 字节)= 102 字节。前导固定为全 FF,用于唤醒网卡;后续 16 次 MAC 重复确保接收方能连续正确识别。

Q: W55MH32 的 WOL 功能是软件实现还是硬件实现

W55MH32 的 WOL 功能是硬件实现。通过 setMR(MR_WOL) 使能 WOL 模式,通过 setIMR(IM_IR4) 开启魔术包中断。硬件自动解析 UDP 报文并判断是否为魔术包,匹配时置位 IR 寄存器的 MP 位(0x10),无需软件解析报文内容。

Q: 为什么使用 SocketTester 发送时需要加 $ 符号

SocketTester 的 $# command 模式会将 $ 后跟的两个字符解释为十六进制字节。勾选 Enable 后,每个字节前加 $ 即可发送任意 HEX 数据。注意字节之间不能有空格,否则空格会被当作 0x20 发送。

Q: 收不到魔术包怎么办

排查步骤:① 确认 PC 和 W55MH32 处于同一网段;② 确认 SocketTester 中目标 IP 和端口(9000)正确;③ 确认勾选了 Enable $# command;④ 检查魔术包内容是否包含 W55MH32 实际的 MAC 地址(00:08:DC:00:0E:9A);⑤ 关闭 PC 端防火墙。

Q: WOL 和低功耗模式有什么区别

WOL 是一种网络唤醒机制,设备可通过魔术包从待机/休眠状态恢复到运行状态;低功耗模式是 MCU 的省电模式(如 Sleep/Stop/Standby),减少功耗。W55MH32 的 WOL 主要针对 TOE 引擎的魔术包识别,与 MCU 的低功耗模式配合使用可实现网络唤醒+低功耗的完整方案。

总结

本文讲解了如何在 W55MH32 芯片上实现网络唤醒(WOL)功能:

  • WOL 协议:基于 UDP 广播的远程唤醒协议,通过魔术包(102 字节)唤醒休眠或关机设备
  • 魔术包结构:前 6 字节固定为 FF,之后是目标 MAC 地址重复 16 次,硬件自动解析并触发中断
  • 实现流程:setMR 开启 WOL 模式 → setIMR 开启魔术包中断 → 打开 UDP Socket 监听 → 检测 IR 寄存器 MP 位
  • 关键 API:setMR(MR_WOL) 使能 WOL、setIMR(IM_IR4) 开启中断、getIR() & IR_MP 检测魔术包
  • 应用价值:远程设备管理、工业设备唤醒、智能家居网关控制、网络设备批量维护

下载本章例程

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

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

Andy

W5500 技术支持专家