功能要求:通过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遍重复目标macfor (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的状态下,而是出于某种不会接收魔术包唤醒的“休眠”态。