.NET 网络唤醒
本文介绍下电脑设备关机的情况下如何通过网络唤醒设备,之前电源S状态 计算机Power电源状态- 唐宋元明清2188 - 博客园 (cnblogs.com) 有介绍过远程唤醒设备,后面这俩天了解多了点所以单独加个随笔
这里只做局域网唤醒技术验证哈,用于集控平台设备管理。如果要做外网唤醒可以先确认下是否公网IP,内网IP段:192.168.0.0-192.168.255.255,172.16.0.0-172.16.255.255,10.0.0.0-10.255.255.255
设备关机的情况下,使用网络唤醒的前提条件:
1. 被唤醒设备需要支持这WakeOnLine
首先是有线网口要支持,比如我司大屏有俩个Lan口但只有Lan1支持远程唤醒。然后主板需要支持网络唤醒,要确认可以通过BIOS-电源管理页面查看,如下有Wake by Lan。并且是开启状态
2. 被唤醒设备,接有线网络。关机状态下支持远程唤醒的有线网络接口是黄灯闪烁的
要实现远程唤醒,是需要保持类似心跳的状态,以实现后续发魔术包来唤醒
需要开启网卡的网络唤醒,可以在网卡适配器-属性-电源管理开启。
如下图所示,在关机时Lan1口黄灯闪烁、Lan2口没有灯,说明只有Lan1口是开启了远程唤醒的。
当然开启后也要有BIOS选择支持才行,比如上面BIOS界面看到WakeOnLan支持的是I219,就是指定的Lan1有线网卡:
另一端启动唤醒的设备需要与被唤醒设备处于同一局域网。
不支持无线网卡,因为设备关机情况下无线网卡是断电的!
我测试验证,是将大屏设备有线连接至一个路由器,然后笔记本连接路由器的wifi。大屏设备的ip是192.168.2.9,笔记本的ip是192.168.2.6。
拿到目标设备的IP以及有线Mac地址(可以在设备连接网络的属性里查看):
然后就可以使用发包工具MAGPAC.exe(下载:MAGPAC)试试唤醒,在设备关机的情况下发包就可以自动开机配置如下,输入IP以及Mac地址:
1 private void TestButton_OnClick(object sender, RoutedEventArgs e) 2 { 3 string ip = "192.168.2.9"; 4 string macAddress = "EC:D6:8A:A6:4B:7B"; 5 SendWakeOnLan(ip,macAddress); 6 } 7 8 private static void SendWakeOnLan(string ipAddress, string macAddress) 9 { 10 try 11 { 12 // 将MAC地址转换为字节数组 13 byte[] macBytes = macAddress.Split(':').Select(x => Convert.ToByte(x, 16)).ToArray(); 14 // 创建魔术包 15 byte[] magicPacket = new byte[6 + 16 * macBytes.Length]; 16 for (int i = 0; i < 6; i++) 17 { 18 magicPacket[i] = 0xFF; 19 } 20 for (int i = 0; i < 16; i++) 21 { 22 Array.Copy(macBytes, 0, magicPacket, 6 + i * macBytes.Length, macBytes.Length); 23 } 24 // 使用UDP发送魔术包 25 UdpClient client = new UdpClient(); 26 client.Connect(ipAddress, 9); // 9是WoL的默认端口 27 client.Send(magicPacket, magicPacket.Length); 28 client.Close(); 29 30 Debug.WriteLine($@"唤醒包已发送至: {ipAddress},{macAddress}"); 31 } 32 catch (Exception ex) 33 { 34 Debug.WriteLine("发送唤醒包时发生错误: " + ex.Message); 35 } 36 }
直接远程唤醒关机设备,亲测有效!
1. 删除MAC地址中的分隔符(“:”),魔术数据包由6个0xFF字节后跟16次目标MAC地址
2. 通过UDP协议将数据包发送到指定IP和目标端口9
上方Demo代码见仓库 kybs00/WakeOnLanDemo (github.com)
远程唤醒失败情况
1. 控制端连接多网络的情况下,使用被目标设备的IP唤醒设备,唤醒失败
验证了控制端(如笔记本)连接有线网络的同时,再连接一个Wifi,此wifi与被控制目标设备(如大屏)处理同一局域网。此种情况,使用IP+Mac地址无法唤醒大屏设备。
改为广播地址(255.255.255.255),则可以正常唤醒大屏设备
所以控制端如果是多网络,要使用广播地址来唤醒
2. 控制端连接多网络时,使用广播地址唤醒目标设备,唤醒失败
以下是我操作的必现步骤:
1.大屏(目标设备)关机的情况下插拔其Lan1口(支持远程唤醒) -- 具体使用过程中,确实可能会有这类情况,关机情况下去插上有线
2.笔记本连接有线网络以及Wifi,此Wifi同大屏有线网络是一个局域网下
此操作后,发播放广播255、发大屏有线网络IP,均唤醒无效
但笔记本禁用有线网络适配器、保留wifi,发广播255能成功唤醒大屏设备,发大屏有线网线IP无法唤醒大屏设备
我猜测广播无法生效是因为控制端多网络的情况下,网络连接顺序影响了这个唤醒流程。所以验证以下步骤:
1. 笔记本禁用有线网络适配器后,然后再启用有线网络适配器 -- 发广播255无法唤醒
2. 笔记本禁用有线网络适配器后,重启笔记本,再启用有线网络适配器 -- 发广播255成功唤醒大屏了!
所以UdpClient在多网络时广播,依赖了系统下网络的启用顺序。目标设备插拔Lan口后,广播唤醒需要更长的时间,对应的网络排在前面能保证唤醒流程不被中断。至于不重启笔记本情况下重置网络适配器,无法成功,大概是因为网络连接顺序有缓存吧
Okay,总结下远程唤醒的条件以及最佳唤醒成功率:
1. 目标设备,需要支持远程唤醒,包括有线网口以及主板BIOS。建议关机情况下不插拔有线网络
2. 控制端设备,使用广播地址255来唤醒目标设备,避免多网络情况下唤醒失败
关键字:电源状态、远程唤醒、发包工具MAGPAC.exe
参考文章:
玩转WakeOnLan(远程开机) - 简书 (jianshu.com)
远程唤醒电脑WOL(Wake On LAN - 局域网唤醒)-CSDN博客
WOL(Wake On LAN – 局域网唤醒)外网唤醒 配置教程 远程开机「建议收藏」-腾讯云开发者社区-腾讯云 (tencent.com)