概要
远程开机Wake onLAN(WOL),俗称远程唤醒,是很多网卡都支持的功能。而远程唤醒的实现,主要是向目标主机发送特殊格式的数据包,是AMD公司制作的MagicPacket这套软件以生成网络唤醒所需要的特殊数据包,俗称魔术包(Magic Packet)。
远程开机,又可以被称为远程唤醒技术,英文简称WOL,是指可以通过局域网、互联网或者通讯网实现远程开机,无论被访问的计算机离用户有多远、处于什么位置,只要通过局域网、互联网或者通讯网,就都能够被随时启动。
简单流程
-
必须网卡支持,BIOS 中启用网络唤醒(Wake-on-LAN)
进入BIOS设置:在电脑启动时,按制造商指定的键(如DEL、F2、F10或ESC)进入BIOS设置界面。
导航到电源管理选项:在BIOS菜单中,找到并进入“电源管理”或类似标题的选项。
启用网络唤醒功能:在电源管理设置中,寻找与“远程唤醒”、“ACPI”(高级配置和电源接口)或“网络唤醒”相关的选项,并启用它们。具体的选项名称可能因不同的主板制造商而异,但通常你会找到类似于“允许从S5状态唤醒”或“允许网络唤醒”的设置。
保存更改并退出:完成设置后,保存更改并退出BIOS设置。请注意,不是所有主板和网卡都支持这些功能,因此在尝试远程开机之前,建议检查你的硬件是否满足条件。此外,某些主板可能还需要在操作系统中安装额外的软件或驱动程序才能实现远程开机功能
-
检查设备管理 是否开启远程唤醒
键盘WIN+X,选中设备管理器打开
访问网卡设置,确保网卡的电源管理设置允许计算机通过网络信号被唤醒。这通常涉及在网卡的“电源管理”标签页中启用“允许此设备唤醒计算机”的选项。 -
工具检测,下载Fing
连接当前wifi,查看当前连接设备
选中需要唤醒的设备,点击LAN唤醒,检查设备是否唤醒成功。请注意,设备关机后,检查设备网口灯是否闪烁,唤醒设备相当于设备关机状态变成了睡眠/休眠状态,通过mac地址发送包唤醒设备为工作状态,如果需要唤醒设备,那么网口灯必须是在线闪烁状态。如果设备关机后,网口等无法闪烁,请检查上方配置项或升级网卡驱动等其他因素
-
c# 代码唤醒
代码唤醒,相当于就是模拟发送唤醒魔包
WOL魔术包是有12个F跟随16个重复的mac地址不含‘:’或‘-’符号构成
public static void WakeUp(string mac)
{
try
{
if (mac.Split('-').Length == 6)
{
string macStr = mac.Replace('-', ' '); ;
byte[] macByteArray = HexStringSToByteArray(macStr);
UdpClient client = new UdpClient();
client.Connect(IPAddress.Broadcast, 1234);
byte[] packet = new byte[17 * 6];
for (int i = 0; i < 6; i++)
{
packet[i] = 0xFF;
}
for (int i = 1; i <= 16; i++)
{
for (int ii = 0; ii < 6; ii++)
{
packet[i * 6 + ii] = macByteArray[ii];
}
}
int a = client.Send(packet, packet.Length);
}
}
catch (Exception ex)
{
}
}
/// <summary>
/// 2位16进制转int
/// </summary>
/// <param name="hex"></param>
/// <returns></returns>
public static int HexStringToInt(string hex)
{
int num1 = 0;
int num2 = 0;
char[] nums = hex.ToCharArray();
if (hex.Length == 2)
{
for (int i = 0; i < nums.Length; i++)
{
String strNum = nums[i].ToString().ToUpper();
switch (strNum)
{
case "A":
strNum = "10";
break;
case "B":
strNum = "11";
break;
case "C":
strNum = "12";
break;
case "D":
strNum = "13";
break;
case "E":
strNum = "14";
break;
case "F":
strNum = "15";
break;
default:
break;
}
if (i == 0)
{
num1 = int.Parse(strNum) * 16;
}
if (i == 1)
{
num2 = int.Parse(strNum);
}
}
}
return num1 + num2;
}
/// <summary>
/// 16进制字符串转byte[] 48 65 6C 6C 6F 20 57 6F 72 6C 64 21
/// </summary>
/// <param name="hexValues"></param>
/// <returns></returns>
public static byte[] HexStringSToByteArray(string hexValues)
{
string[] hexValuesSplit = hexValues.Split(' ');
byte[] val = new byte[hexValuesSplit.Length];
int i = 0;
foreach (string hex in hexValuesSplit)
{
int value = HexStringToInt(hex);
val[i] = (byte)value;
i++;
}
return val;
}