全部例程

WOL

W5500 其他标签

2025/02/12 更新

本篇文章,我们将详细介绍如何在W5500芯片上面实现网络唤醒(Wake-on-LAN)功能。

该例程用到的其他网络协议,例如DHCP,请参考相关章节。有关初始化过程,请参考Network Install章节,这里将不再赘述。

WOL简介

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

WOL特点

  • 简单性:WOL的核心是魔术包(Magic Packet),其格式非常简单且固定。魔术包由102个字节组成,前6 个字节固定为0xFF,后续是目标设备的MAC地址重复16次。
  • 设备待机唤醒: WOL允许设备在不使用时进入低功耗状态,如待机、休眠或关机状态。当有远程唤醒需求时 设备能够通过接收魔术包快速恢复到正常运行状态,满足用户的使用需求。
  • 广播机制: 魔术包通常是通过UDP广播的形式发送,即使设备的IP地址未知或存在多台设备,也能通过广播包找到目标设备。
  • 安全性高:WOL 协议基于 MAC 地址来识别目标设备,只有当魔术包中包含的 MAC 地址与网卡自身的 MAC 地 址匹配时,设备才会被唤醒。

WOL应用场景

接下来,我们了解下在W5500上,可以使用WOL协议完成哪些操作及应用呢?

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

WOL协议基本工作流程

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

实现过程

接下来,我们在 W5500上实现WOL远程唤醒测试。

wol_run()函数用于处理与UDP Socket相关的操作,以监听和处理网络唤醒魔术包。这个函数需要主循环中调用,如下所示:


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

wol_run()函数内容如下:


/**
* @brief  Wake on Lan run function
* @param  sn: Socket number
* @param  buf: ethernet buffer pointer
* @param  local_port: Local port
* @return none
**/
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;
    }
}

wol_run需要传入3个参数,分别是socket号,socket缓存以及源端口号。

wol_run()函数通过不断检查socket状态,当socket处于SOCK_CLOSED状态时,会创建一个UDP模式的socket,并开启WOL功能以及中断,当socket处于SOCK_UDP模式时, 只需不断的监听中断寄存器,当W5500收到魔法包时,IR寄存器的MP位(0x10)生效,此时可以进行唤醒操作。

运行结果

请注意:

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

烧录例程运行后,首先进行了PHY链路检测,然后通过DHCP设置网络信息,通过网络调试助手发送魔术包实现远程唤醒。使用sockettest网络助手发送hex格式数据 需要勾选Enable $# command选项在每个数据前面加上$符号,注意不能有空格,空格会被转换为0X20。

请注意:

(若使用其他网络调试助手发送HEX格式即可)

如下图所示:

总结

本文讲解了如何在 W5500 芯片上实现网络唤醒(WOL)功能,通过实战例程展示了从设置 UDP Socket 监听魔术包到接收并处理魔术包实现设备唤醒的完整过程。文章详细介绍了 WOL 的概念、特点、应用场景、基本工作流程,帮助读者理解其在远程设备管理和节能方面的实际应用价值。 下一篇文章将解析调节 PHY 速率的方法,根据场景调节不同的 PHY 速率以达成低功耗目标,敬请期待!

下载本章例程

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

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