本文介紹下電腦裝置關機的情況下如何透過網路喚醒裝置,之前電源S狀態 計算機Power電源狀態- 唐宋元明清2188 - 部落格園 (cnblogs.com) 有介紹過遠端喚醒裝置,後面這倆天瞭解多了點所以單獨加個隨筆
裝置關機的情況下,使用網路喚醒的前提條件:
1. 被喚醒裝置需要支援這WakeOnLine
首先是有線網口要支援,比如我司大屏有倆個Lan口但只有Lan1支援遠端喚醒。然後主機板需要支援網路喚醒,要確認可以透過BIOS-電源管理頁面檢視,如下有Wake by Lan。並且是開啟狀態
2. 接有線網路(關機狀態下有線網路介面是黃燈閃爍的),另一端啟動喚醒的裝置需要與被喚醒裝置處於同一區域網。
不支援無線網路卡,因為裝置關機情況下無線網路卡是斷電的!
我測試驗證,是將大屏裝置有線連線至一個路由器,然後筆記本連線路由器的wifi。大屏裝置的ip是192.168.2.9,筆記本的ip是192.168.2.6。
拿到目標裝置的IP以及有線Mac地址(可以在裝置連線網路的屬性裡檢視):
然後就可以使用發包工具MAGPAC.exe(下載:MAGPAC)試試喚醒,在裝置關機的情況下發包就可以自動開機配置如下,輸入IP以及Mac地址:
也可以自己寫.NET程式碼呼叫,發資料包來喚醒:
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
注意,不是廣播而是指定IP傳送資料包,網上有些說是用廣播地址(255.255.255.255),我驗證了是不起作用的。
上方Demo程式碼見倉庫 kybs00/WakeOnLanDemo (github.com)
關鍵字:電源狀態、遠端喚醒、發包工具MAGPAC.exe