资讯详情

如何通过WOL(Wake On Lan)唤醒电脑

文章目录

  • 如何通过WOL(Wake On Lan)唤醒电脑
    • demo
    • 痛点
    • 什么是(Wake On Lan)局域网唤醒
    • 打开局域网唤醒
      • 1. 支持WOL的有线网卡
      • 2. 在BIOS中开启wake on lan
      • 3. 配置过程
        • 1. 进入设备管理器
        • 2. 找到有线网卡
        • 3. 右键高级-属性中设置右键进入属性,打开关机网络唤醒和魔术封包唤醒;
        • 5. 在电源管理中,检查允许计算机关闭该设备以节省电源和允许该设备唤醒计算机。至于只允许幻想数据包唤醒计算机,您可以检查或不检查。毕竟,我们WOL使用幻数据包。
      • 测试是否生效
        • 1. 让笔记本睡觉
        • 2. 唤醒笔记本
      • 总结
    • 原理解析
      • 原理
      • 什么是幻数据包?(Magic Packet)
      • UDP协议
      • 代码实现
    • 最终实现
      • 流程图
      • 前提条件
        • 1. 小服务器
        • 2. 内网穿透工具
        • 3. 代码
        • 4. 远程电脑
    • 鸣谢

如何通过WOL(Wake On Lan)唤醒电脑

demo

话不多说,先看效果视频

点击查看视频(bilibili)

痛点

作为开发人员,我们经常需要远程访问我们的笔记本电脑,这会遇到一个大问题,那就是我们的笔记本电脑必须始终处于启动状态。有没有一种情况是,当我们需要远程笔记本电脑时,我们先启动远程笔记本电脑,然后启动远程笔记本电脑?经过我的在线查询,我发现真的有办法远程启动笔记本电脑,即(Wake On Lan)局域网唤醒。

其实很多BIOS支持电源自动启动,所以没有必要做这样的麻烦,直接买一个智能插座可以做一切,我提供的只是一个非常小的解决方案,更有可能面对笔记本电脑,因为大多数笔记本电脑没有电源自动启动这个功能

什么是(Wake On Lan)局域网唤醒

网络唤醒(Wake-on-LAN,WOL)是一种计算机局域网唤醒技术,使局域网处于关闭或休眠状态,将状态转化为指导(Boot Loader)或运行状态。无线唤醒(Wake-on-Wireless-LAN,WoWLAN)作为 WOL 使用无线网卡唤醒计算机的补充技术。在一般局域网环境中使用有限的广播地址(255.255.255.255)由于路由器不将目的地址转发为有限广播地址的数据报告,子网定向广播地址通常用于复杂的网络条件。路由器可用于在局域网外唤醒局域网内的特定计算机 DDNS 与端口转发。

英特尔和 IBM 成立了 Advanced Manageability Alliance。1997年4月,联盟提出 WOL 技术。这是 WOL 随后各大厂商纷纷推出自己的技术起源 WOL 技术标准。本文所讨论的 WOL 技术是由 AMD 公司提出的 Magic Packet唤醒(幻数据包,魔术包)。

打开局域网唤醒

我在这里写的可能不好。你可以参考别人的方法 如何远程打开电脑:WoL原理和陷阱

1. 支持WOL的有线网卡

现在有线网卡一般都支持WOL。

请注意,一般无线网卡无法支持WOL,由于无线网卡与路由器之间的链路在断电时断开,与有线连接不同,它们之间的链路没有断开;

2. 在BIOS中开启wake on lan

这一步是不必要的。我们需要进入笔记本BIOS以我为例:

高级 --> 电源管理 --> PCI-E设备唤醒 --> 选项设置为enable

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-glEHnnnh-1630685292220)(http://blog.lengff.com/img/wakeonlan/bios-wakeonlan.jpg)]

不同的计算机进入BIOS界面不同, 请根据自己的BIOS界面,这里简单列出几个简单的答案

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-bWmHhj0u-1630685292225)(http://blog.lengff.com/img/wakeonlan/bios-wakeonlan1.jpg)] [外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-qxqr4rZ2-1630685292232)(http://blog.lengff.com/img/wakeonlan/bios-wakeonlan3.jpg)]

3. 配置过程

1. 进入设备管理器

2. 找到有线网卡

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-INBw3Vzd-1630685292238)(http://blog.lengff.com/img/wakeonlan/config_step_2.png)]

3. 右键高级-属性中设置右键进入属性,打开关机网络唤醒和魔术封包唤醒;

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-sy4g6wEf-1630685292240)(http://blog.lengff.com/img/wakeonlan/config_step_3.png)] [外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-NkB0136s-1630685292243)(http://blog.lengff.com/img/wakeonlan/config_step_4.png)]

5. 在电源管理中,检查允许计算机关闭该设备以节省电源和允许该设备唤醒计算机。至于只允许幻想数据包唤醒计算机,您可以检查或不检查。毕竟,我们WOL使用幻数据包。

请注意,如果没有上述选项或类似选项,请更新驱动程序。如果最新的驱动程序仍然没有,这意味着您的网卡不支持WOL了。

测试是否有效

Wake On Lan over the Internet

1. 让笔记本睡觉

电源 -> 睡眠 

2. 唤醒笔记本

win系统获取mac命令 ipconfig -all

其实这里支持的方法有很多,这里就不一一列举了,列举两个最简单快捷的方法

1)点击上述链接输入相应的链接IP需要唤醒的地址和笔记本mac点击地址wake up即可

2)或使用微信小程序,搜索网络唤醒即可

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-Uvu60bHT-1630685292249)(http://blog.lengff.com/img/wakeonlan/cofig_step_6.jpg)]

总结

通过上面的简单配置就可以让我们的笔记本能够在局域网下远程开机,所以我们可以根据这一个逻辑对其做出优化处理。

原理解析

原理

WOL 技术被提出了将近20年,绝大多数的现代网卡都支持在超低功耗下监听特定的报文,如 ARP。如果设备网卡接收到一个与自己 MAC 地址相同的幻数据包,则网卡会向计算机的电源或主板发出信号以唤醒计算机。大部分的幻数据包在数据链路层(OSI模型第2层)上发送,当发送时,使用广播地址广播到给定的网络上,不使用IP地址(OSI模型第3层)。当然这是绝大部分情况,幻数据包也可以使用特定的 IP 地址进行发送。

简单的用个人的理解来讲述一下。

  1. 当我们的笔记本关机的时候,如果我们开启了wake on lan时,我们的网卡是会处于待机状态
  2. 此时我们通过UDP通信向网卡发送一组幻数据包到网卡上
  3. 网卡就会发送特定的信号唤醒电脑从而实现电脑的开机

什么是幻数据包(Magic Packet)

幻数据包是一个广播帧,包含目标计算机的MAC地址。由于 MAC 地址的唯一性,使数据包可以在网络中被唯一的识别。幻数据包发送通常使用无连接的传输协议,如 UDP ,发送端口为 7 或 9 ,这只是通常做法,没有限制。

幻数据包最简单的构成是6字节的255(FF FF FF FF FF FF FF),紧接着为目标计算机的48位MAC地址,重复16次,数据包共计102字节。有时数据包内还会紧接着4-6字节的密码信息。这个帧片段可以包含在任何协议中,最常见的是包含在 UDP 中。

例如 MAC 地址为 11 22 33 44 55 66 的目标计算机,幻数据包的格式为:

FFFFFFFFFFFF 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 [ABABABABABAB(这里为6个字节的密码)]

UDP协议

因为这里需要通过Java程序向我们的网卡发送幻数据包,使用的UDP通信协议。

  • 关于UDP编程请参考 UDP网络编程DatagramSocket及DatagramPacket的简单使用

  • 关于UDP和TCP请参考 一文搞懂TCP与UDP的区别 或自行百度

代码实现

不同的代码有不同的实现方式,这里我们使用java代码作为示例

/** * @auther Lengff * @time 2021/9/2 * @fileName WakeOnLan */
public class WakeOnLan { 
        
    private static final int PORT = 9;
    private static final String header = "FF:FF:FF:FF:FF:FF";
    private static final String concatStr = ":";
    private static final String macStr = "1C:7B:1C:2D:7A:0C";
    private static final String ipStr = "192.168.1.100";

    public static void main(String[] args) { 
        
        StringBuilder stringBuilder = new StringBuilder(header);
        for (int i = 0; i < 16; i++) { 
        
            stringBuilder.append(concatStr);
            stringBuilder.append(macStr);
        }
        
        try { 
        
            byte[] bytes = getHexBytes(stringBuilder.toString());
            InetAddress address = InetAddress.getByName(ipStr);
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, PORT);
            DatagramSocket socket = new DatagramSocket();
            socket.send(packet);
            socket.close();
            System.out.println("已发送局域网唤醒数据包");
        } catch (Exception e) { 
        
            System.out.println("无法发送Lan唤醒数据包: " + e);
        }
    }

    private static byte[] getHexBytes(String macStr) throws IllegalArgumentException { 
        
        String[] hex = macStr.split("(\\:|\\-)");
        byte[] bytes = new byte[hex.length];
        try { 
        
            for (int i = 0; i < hex.length; i++) { 
        
                bytes[i] = (byte) Integer.parseInt(hex[i], 16);
            }
        } catch (NumberFormatException e) { 
        
            throw new IllegalArgumentException("请使用十六进制的字符");
        }
        return bytes;
    }
}

最终实现

本来以为这个东西挺简单的,三言两语就应该能讲述的清楚,但是我发现还是比较难用文字把整个实现过程讲述清楚,但是我相信上面的代码也足以让大家实现远程开机的demo,只要根据这个demo就能简单快速的做到远程开机,所以这里就简单讲讲我这个视频里面的实现逻辑。

流程图

这里的流程其实是挺简单的,我觉得大家看图就应该能看懂了

前提条件

1. 一台小型服务器

既然要使用这个功能,就必然需要有一个内网的设备来向电脑发送指令,且需要这个设备一直在线; 最理想的其实是路由器,直接通过公网IP来发送指令,但是我们其实很多时候是没有办法拥有公网访问能力,具体可以看看其他大神通过DDNS来实现; 我个人更倾向使用树莓派这些mini服务器来做,既安全而且不依赖网络环境,我的个人博客也是部署在树莓派上面,所以能一举两得

2. 内网穿透工具

如果说是用路由的话且可以访问公网,就只要搞一个DDNS就可以了,但是如果跟我一样使用mini服务器的话,就必须用到一些内网穿透工具;这里也分两种情况

  • 如果有你自己有服务器的话就可以考虑使用 frp内网穿透 或者OPENVPN 这类反向代理实现内网穿透的工具
  • 如果你没有自己服务器的话就可以使用 ngrok 这类简单粗暴内网穿透工具,我用的比较多的是natapp 和 https://www.ngrok.cc/ ,里面有一些收费隧道,价格也不贵,主要是带宽也挺大的,相较于自己买服务器的话,这种的带宽会更大,且更便宜。

3. 代码

我自己临时搞的demo,代码乱糟糟的,有感兴趣的同学可以联系找我那代码,放github就算了,并不是说有多稀罕,主要是自己也是改的别人的开源代码,搞的又很乱,这种东西拿出来开源我觉得实在是没脸。

4. 远程电脑

这里需要单独拿出来讲一讲,这里大概描述一下

  1. 使用内网穿透实现
  • 内网穿透的话就是直接使用系统自带的远程连接来实现远程
  1. 直接使用第三方的远程工具,这里推荐几个我觉得还不错的
  • teamviewer
  • todesk
  • AnyDesk
  • 向日葵
  • vncviewer

  1. 大家用这个功能的时候一定是要在插着网线的情况,且电源没有拔掉的情况下,否则这个是不生效的
  2. 我实测很多次发现一定是开过一次机后关机这个才能用,如果是直接断电了的话这个依旧是不生效的

鸣谢

如何远程开启你的电脑:WoL的原理和陷阱

网络唤醒(WOL)全解指南:原理篇

局域网唤醒(WOL)与远程唤醒教程

网络唤醒原理浅析(Wake On LAN)

一文搞懂TCP与UDP的区别

UDP网络编程DatagramSocket及DatagramPacket的简单使用

标签: lan的连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台