远程Windows开机:WoL(Wake-on-Lan)客户端Java实现

Published on 2024-08-20 23:11 in 分类: 软件 with 狂盗一枝梅
分类: 软件

以前在公司想要复制家里电脑的一些数据,需要上班前将家里电脑打开,之后在公司用远程工具连接家里的电脑复制数据,这样不仅浪费电,万一一不小心关机,在公司就只能干瞪眼了。

借助WoL技术(Wake-on Lan)可以将电脑远程开机,关于Wol,可以参考维基百科:《网络唤醒》它的基本原理就是支持Wol技术的网卡在电脑关机之后,网卡还有微弱的供电,当它发现网络广播的内容中有特定的“魔法数据包”,并且经过解析发现它所指的地址是自身所处的电脑时,网卡就会通知机内的主板电源供应器,开始进行开机(或唤醒)的程序。

具体来说,只要发送特定格式的UDP广播数据包到子网中,就能将计算机唤醒,数据包格式:

FF FF FF FF FF FF FF MAC 地址 × 16 4-6字节的密码(可空)

根据此,对应的java版本代码如下

import cn.hutool.core.util.HexUtil;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * @author kdyzm
 * @date 2023/12/7
 */
public class Application {

    public static void main(String[] args) {
        try {
            InetAddress inetAddress = InetAddress.getByName("192.168.3.255");
            int port = 9;
            StringBuilder data = new StringBuilder("FFFFFFFFFFFF");
            for (int i = 0; i < 16; i++) {
                // 网卡MAC地址    
                data.append("58112208850B");
            }
            data.append("000000000000");
            byte[] bytes = HexUtil.decodeHex(data.toString());
            DatagramSocket datagramSocket = new DatagramSocket();
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length, inetAddress, port);
            datagramSocket.send(packet);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }
}

代码已经上传到gitee:https://gitee.com/kdyzm/wol.git

注:

  1. 广播地址是255.255.255.255,这里使用了子网广播地址192.168.3.255
  2. 端口号9是目标网卡的接收端口号,目标网卡会监听此端口号传过来的数据包
  3. 这里使用了6字节的密码"000000000000",其实没啥用,不加也行。

当然有了这个程序,还是不行的,还需要硬件支持和相关的配置开启。

第一步:检查Bios设置是否已经开启Wol

进入Bios之后,进入电源选项,每个品牌的可能长得都不一样,但是大差不差能看出点门道

image-20240820230625064

类似于这种的配置将其开关打开。

第二步:配置计算机允许远程唤醒

image-20240820230945316

之后再运行程序就应该可以实现远程开机了。


#windows #win10
复制 复制成功