1. WOL简介

当计算机安装有支持网络唤醒(wake on lan, WOL)功能的网卡,并且主板打开了网络唤醒功能时,这台计算机会在收到符合特征的UDP数据包时自动开机(计算机虽然关机,但这个模式下网卡并未休眠,会响应WOL数据包)。

2. WOL数据包格式及工作流程

WOL数据包以6个连续的0xFF开头,后面是重复的16遍需要唤醒的mac地址。按这个数据格式构造好WOL数据包,以UDP协议广播出去,即可实现需求。

3. 功能的限制

  • 限制一,IP广播只能传播到本网段,无法跨网段发送广播包(受广播域限制);
  • 限制二,WOL数据包需要由一台运行中的设备来发送,比如路由器(某些路由器会集成这个功能)、PC、树莓派、甚至单片机等,家用环境不一定能满足这样的条件;
  • 限制三,被唤醒机器需要支持WOL(网卡和主板都需要支持,并且需要到BIOS中开启WOL唤醒功能)。

4. 推荐集成方式

这个功能建议集成到WEB服务或者Socket服务里,这样可以向浏览器、或者各种客户端提供接口,一旦接口被调用,即向网络中发送唤醒包(我的网络唤醒服务以WEB形式部署在了一台由PC充当的服务器上,同时在微信公众号后台加入相应关键词入口,一旦触发即调用家中的WOL服务,直接从微信唤醒家中的电脑)。

5. 适用范围更广的方案

如果希望突破WOL的限制,得到可用性更高的方案,可以利用继电器连接主板跳线的开机信号针脚,继电器使用串口与电脑、树莓派、单片机相连,WEB服务或者Socket服务在收到客户端的开机命令时,闭合继电器,此时即相当于人工按下开机键按钮,达到开机的目的。

6. WOL唤醒功能实现


        /// <summary>
        /// 向局域网广播WOL包,唤醒指定mac地址的设备
        /// </summary>
        /// <param name="mac">需要网络唤醒的mac地址,格式可以是: 
        /// xx:xx:xx:xx:xx:xx, 
        /// xx-xx-xx-xx-xx-xx, 
        /// xxxxxxxxxxxx</param>
        void Wake(string mac)
        {
            //预格式化mac地址,只保留字母和数字
            string macFormatted = Regex.Replace(mac, "[^a-fA-F0-9]", "");
            byte[] maci = new byte[6];
            for (int i = 0; i <= 5; i++) maci[i] =
                    Convert.ToByte(macFormatted.Substring(i * 2, 2), 16);
            List<byte> wollist = new List<byte>();
            for (int i = 0; i < 6; i++) wollist.Add(0xff);
            for (int i = 0; i < 16; i++) wollist =
                    wollist.Concat(maci).ToList();
            System.Net.Sockets.UdpClient waker =
                new System.Net.Sockets.UdpClient { EnableBroadcast = true };
            //WOL包的接口并无特别规定,随便挑一个合法端口
            waker.Connect("255.255.255.255", 255);
            waker.Send(wollist.ToArray(), wollist.Count);
        }
分类: articles