您的位置:首页 > 理论基础 > 计算机网络

Java网络编程————UDP实现ThinkPad S5网络唤醒

2018-02-11 21:56 393 查看
功能要求:通过Java程序实现ThinkPad S5 笔记本网络唤醒
必备知识
一、定义:网络唤醒,通过局域网、互联网或通讯网络,以有线网卡的形式,向目标电脑发送魔法包(Magic Packet),让电脑自动开机。该技术目前被大多数主板和网卡所支持。
二、远程唤醒必备条件:  远程唤醒只能依赖于主机硬件实现。
1.主板支持,能够在关机时为网卡供电,2002年以后的大部分主板都支持该功能。
2.主板设置:各种类型电脑有所区别,但基本上都是在BIOS中设置Power Management Setup,中Wake Up On Lan为Enable,各个机型意思大同小异。
3.网卡设置:打开网卡的远程唤醒功能步骤如下:我的电脑—>管理—>设备管理器—>网络适配器—>以太网卡—>属性—>高级—>“魔术封包唤醒”—>开启(Enable),—>电源管理—>一直勾选到"只允许幻数据包唤醒计算机"—>确定。完成!
4.远程唤醒目标主机必须连接电源。笔记本必须插继电器。
5.目标主机上一次必须正常关机。
6.发送开机命令的主机必须能够与目标主机建立通讯:如果发送广播魔术包,那么只要保证广播包能够到达目标主机即可;如果发送的是定向包则需要局域网路由器的支持,需要在路由其中配置一个到目标主机的路由信息。
三、魔术包的组成
魔术包的组成非常固定,由6对“FF”组成前缀,其余为重复16次的MAC地址组成。例如:试验机的MAC为:“28-D2-44-35-68-A7”,那么魔术包为:
“0xFFFFFFFFFFFF28D2443568A728D2443568A728D2443568A728D2443568A728D2443568A728D2443568A728D2443568A728D2443568A728D2443568A728D2443568A728D2443568A728D2443568A728D2443568A728D2443568A728D2443568A728D2443568A7”
windows系统中通过cmd中ipconfig -all来查看Mac地址,注意,是以太网卡,这里的网卡名称与上面网卡设置中的网卡名称是一致的。

Java代码:/**
* 通过指定目标主机Mac唤醒网卡所属主机
*
* @author mht
* @param objectMac
* @since 2018.2.7 西安浮雕墙项目亲测:)
*/
public static void wakeYourPC(char[] objectMac) {
char[] head = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

char[] cmd = new char[102];
// 拼接数据包
System.arraycopy(head, 0, cmd, 0, head.length);
// 需要16遍重复目标mac
for (int i = 0; i < 16; i++) {
System.arraycopy(objectMac, 0, cmd, 6 + i * 6, head.length);
}
final String cmdStr = new String(cmd);
try {
byte[] data = cmdStr.getBytes("ISO-8859-1");
/* 在Java UDP中单播与广播的代码是相同的,要实现具有广播功能的程序只需要使用广播地址即可 */
InetAddress inetAddr = InetAddress.getByName("255.255.255.255");
int port = 7010;
// 获取广播socket
// MulticastSocket client = new MulticastSocket(port);
DatagramSocket client = new DatagramSocket();
// 封装数据包
DatagramPacket packet = new DatagramPacket(data, data.length, inetAddr, port);
// 发送魔法包
for (int i = 0; i < 3; i++) {
client.send(packet);
Thread.sleep(100);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}OK,大功告成!
参考教程
《如何开启网卡的网络唤醒功能》来自联想知识库:点击打开链接

《使用Java Socket发送魔术包:实现电脑远程开机(WOL)》:点击打开链接
==================2018/3/1 更新================================================
除了上述被唤醒电脑的常规配置,主板以及网卡,有时候还是不能唤醒目标主机,咨询了一下英特尔产品支持,了解到一个重要的细节:勾选掉“启用快速启动”。
如图:



这是在win10和win8系统中存在的选项,在win7系统中并未找到此项。当勾选掉这一项后,再使用网络唤醒就可以成功了。
原因是,这一项勾选的话可能会导致部分机器在正常关机之后并不是出于shutdown的状态下,而是出于某种不会接收魔术包唤醒的“休眠”态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: