.NET 网络唤醒

75 阅读3分钟

前言

本文介绍下电脑设备关机的情况下如何通过网络唤醒设备,之前电源S状态有介绍过远程唤醒设备,后面这俩天了解多了点所以单独加个记录一下。

正文

设备关机的情况下,使用网络唤醒的前提条件:

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 (files.cnblogs.com/files/kybs0…) 试试唤醒,在设备关机的情况下发包就可以自动开机配置如下,输入IP以及Mac地址:

4067f15d055ea0e0107ce0587731682f_685541-20240830183341923-1081742187.png

也可以自己写.NET代码调用,发数据包来唤醒:

private void TestButton_OnClick(object sender, RoutedEventArgs e)
{
    string ip = "192.168.2.9";
    string macAddress = "EC:D6:8A:A6:4B:7B";
    SendWakeOnLan(ip,macAddress);
}

private static void SendWakeOnLan(string ipAddress, string macAddress)
{
    try
    {
        // 将MAC地址转换为字节数组
        byte[] macBytes = macAddress.Split(':').Select(x => Convert.ToByte(x, 16)).ToArray();
        // 创建魔术包
        byte[] magicPacket = new byte[6 + 16 * macBytes.Length];
        for (int i = 0; i < 6; i++)
        {
            magicPacket[i] = 0xFF;
        }
        for (int i = 0; i < 16; i++)
        {
            Array.Copy(macBytes, 0, magicPacket, 6 + i * macBytes.Length, macBytes.Length);
        }
        // 使用UDP发送魔术包
        UdpClient client = new UdpClient();
        client.Connect(ipAddress, 9); // 9是WoL的默认端口
        client.Send(magicPacket, magicPacket.Length);
        client.Close();

        Debug.WriteLine($@"唤醒包已发送至: {ipAddress},{macAddress}");
    }
    catch (Exception ex)
    {
        Debug.WriteLine("发送唤醒包时发生错误: " + ex.Message);
    }
}

直接远程唤醒关机设备,亲测有效!

1、删除MAC地址中的分隔符(“:”),魔术数据包由6个0xFF字节后跟16次目标MAC地址

2、通过UDP协议将数据包发送到指定IP和目标端口9

注意,不是广播而是指定IP发送数据包,网上有些说是用广播地址(255.255.255.255),我验证了是不起作用的。

上方Demo代码见仓库 kybs00/WakeOnLanDemo (github.com)(github.com/kybs00/Wake…)

关键字:电源状态、远程唤醒、发包工具MAGPAC.exe

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!