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);
}