前言
最近又开始部署以前的软件,软件使用了远程开关机功能。但是这次部署又遇到新的问题,有 win7 的计算机不能实现远程开机功能,测试了许久找到答案。如有其他问题可以讨论。
远程开机实现思路(不能开机就死磕这几点)
1. 首先需要计算机硬件支持,具体支持与否目前我也不知道,我遇到的计算机基本都支持,有一些很老的 xp 都支持;
2. 配置 bios,将有关 wake on lan 关键词的项设置为 enable;
3. 配置网卡;
4. 将 mac 地址组包后用 UDP 关播发出。
远程开机说明
远程开机原理(官方话)
网络远程开机,也被称作 Wake On Lan,其原理很简单,就是计算机处于关闭状态时,网卡仍然处于激活状态,可以接收来自网络的数据包,如果收到的数据包符合特定的格式,那么就启动机器。
这种数据包是具有特定格式的 UDP 数据报,被称为“魔术包”。UDP 端口不限,但很多实现都使用 2034 这个端口号。报文的载荷部分共 102 个字节,每六个字节为一组,这样就分成了 17 个组。其中第 1 组为固定的 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF,第 2-17 组中的每个组都是远程机器网卡的 MAC 地址。
由于远程网卡虽然处于活动状态,但并没有网络协议栈的软件功能,所以也就不存在 IP 地址的概念,所以“魔术包”通常是 UDP 广播包,因为 UDP 广播包会使用对应的以太网广播包发送。
个人理解
其实就是将 MAC 地址转换成特定的数据包,然后通过 udp 广播发送出去。这是最基本的原理,前提是计算机要支持远程唤醒功能。
远程开机 bios 配置
关键词:wake on lan s5/wake on lan
"Remote Wake Up";
"Boot on LAN";
"Wake on LAN";
"PME Event WakeUp",;
"Resume by MAC LAN";
"Wake-Up by PCI card";
"Wake Up On PCI PME";
"Power On by PCI Card";
"WakeUp by PME of PCI";
"Power On By PCI Devices";
"WakeUp by Onborad LAN";
"Resume By PCI or PCI-E Ddevice
PCI 唤醒
关键词:Restore on AC power loss
我再这里卡了:
1、Power Off(当电流恢复时,计算机处在关机状态)
2、Power On(当电流恢复时,计算机处在开机状态)
3、Last state(最近一次的状态,也就是断电时的状态)
网卡设置
1. 进入设备管理器

2. 高级设置

3. 电源管理(取消第一个,一般情况第一个取消了后面的都不能点了)

各大主板厂商官网
技嘉 http://www.gigabyte.com.cn/
华硕 http://www.asus.com.cn/
微星 http://www.microstar.com.cn/
升技 http://www.abit.com.cn/
华擎 http://www.asrock.com.tw/index.cn.asp
英特尔 http://www.intel.com.cn/
精英 http://www.ecs.com.cn
磐正 http://www.epox.cn/
富士康 http://www.foxconn.com.cn/
七彩虹 http://tec.colorful.cn/
昂达 http://www.onda.cn/index.jsp
硕泰克 http://www.soltek.com.cn/
捷波 http://www.jetway.com.cn/home/index.asp
青云 http://www.albatron.com.tw/
富士康 http://www.foxconnchannel.com/
映泰 http://www.biostar.cn/
奔驰 http://www.sz-paradise.com/
建基 http://www.aopen.com.cn/
梅捷 http://www.soyo.com.cn/
双敏 http://www.unika.com.cn/(磐英)
泰安 http://www.tyan.com/l_chinese/
奥美嘉 http://www.aomg.com.cn/
冠盟 http://www.gamen.com.cn/
远程开机代码
注意点: MAC 地址一定要对/我用的是广播,你可以试试其他/端口我随便写的,似乎不影响
/* Note:
* 被控计算机需要支持网络唤醒功能(Wake on LAN)
* 1.组织魔法包(MgicPacket) 由 6 字节 0xFF 和重复 16 次的 MAC 地址 102 字节
* 2.通过 UDP 的方式广播 IP 地址为路由的广播地址 如:网段为 192.168.1.x,IP 设为 192.168.1.255
* @strMac: 格式示例 "20:af:0a:47:aa:bb"
*/
void TRemoteCtrlPC::wakeOnLAN(QString strMac)
{
/*将字符串 MAC 转换成十六进制 存入数组*/
char cstrMacAddr[6];
bool isOK;
for(int j = 0;j < 6; j++){
if(j < 5){
cstrMacAddr[j] = strMac.mid(strMac.indexOf(":",j*3) - 2,2).toInt(&isOK,16);
if(false == isOK)
return ;
}else if(j == 5){
cstrMacAddr[j] = strMac.mid(strMac.indexOf(":",j*3 - 1) + 1,2).toInt(&isOK,16);
if(false == isOK)
return ;
}
}
/*构建一个魔术唤醒包 6 字节 0xFF 和 16 次的 Mac 地址*/
QByteArray magicPacket;
/*6 个 0xFF*/
for(int i = 0;i < 6; i++){
magicPacket[i] = 0xFF;
}
/*16 个 MAC*/
for(int k = 0; k < 16; k++)
{
for(int l = 0; l < 6; l++)
magicPacket[(k+1)*6 + l] = cstrMacAddr[l];
}
QHostAddress FakeAddress;
FakeAddress.setAddress ("192.168.1.255");
QUdpSocket udpSocket;
udpSocket.writeDatagram(magicPacket, 102, FakeAddress, 9);
}
总结
开机不成功,死磕上面几点。我就是这样的,现在遇到的计算机都能开机。