远程唤醒局域网主机技术Wake On LAN

WOL用途

如果你在开发一个计算机管理软件(利旧现有主机,实现统一运维管理),例如电脑课开课前老师一键开启电教室的电脑 。

魔法原理

Wake-on-LAN 的原理其实很简单。我们发送一个特殊的网络包(俗称"魔术包"),包含目标电脑网卡的 MAC 地址。网卡收到这个包后,就会像被一桶冰水泼醒一样,启动整个系统。

准备材料

  •  Node.js(我们的魔法棒)
  • 一台支持 WoL 的电脑
  • 目标电脑的 MAC 地址
  • BIOS配置

进入BIOS时注意,不同主机不一样,有的F1有的F2,有的需要按下Fn键

测试过四五台主机,发现BIOS默认就是开启的~然后需要注意的就是电池管理,台式机一般也是默认支持,但笔记本就需要检查是否开启省电模式,需要关掉省电模式

编写代码

首先,复制下面的代码,把它保存为 `wakeOnLAN.js`:

const dgram = require('dgram');

function wakeOnLAN(macAddress, options = {}) {
  const {
    ipAddress = '255.255.255.255',
    port = 9,
    attempts = 5,
    interval = 100,
  } = options;

  return new Promise((resolve, reject) => {
    const magicPacket = createMagicPacket(macAddress);
    const client = dgram.createSocket('udp4');
    let attemptsMade = 0;

    function sendPacket() {
      client.send(magicPacket, 0, magicPacket.length, port, ipAddress, (err) => {
        if (err) {
          client.close();
          reject(err);
          return;
        }

        attemptsMade++;
        console.log(`尝试 ${attemptsMade}: 魔术包已发送!`);

        if (attemptsMade >= attempts) {
          client.close();
          resolve(`完成 ${attempts} 次唤醒尝试,希望公主已经醒了!`);
        } else {
          setTimeout(sendPacket, interval);
        }
      });
    }

    sendPacket();
  });
}

function createMagicPacket(macAddress) {
  if (!/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/.test(macAddress)) {
    throw new Error('MAC 地址格式不对哦,再检查一下呗!');
  }

  const cleanMac = macAddress.replace(/[:-]/g, '');
  const buffer = Buffer.alloc(102);
  
  buffer.fill(0xFF, 0, 6);
  
  for (let i = 1; i <= 16; i++) {
    cleanMac.match(/.{2}/g).forEach((hex, j) => {
      buffer.writeUInt8(parseInt(hex, 16), i * 6 + j);
    });
  }

  return buffer;
}

测试方法:

wakeOnLAN('00:11:22:33:44:55', { attempts: 5, interval: 100 })
  .then(result => console.log(result))
  .catch(error => console.error('哎呀,魔法失效了:', error));

使用函数

简单的测试

node wakeOnLAN.js

对外暴露api接口

 req.body.pcs.map((e) => wakeOnLAN(e.mac, {
          ipAddress: e.ip,
          port: e.port,
          interval: req.body.interval,
          attempts: req.body.attempts
}))

注意事项

  • 如果失效了,不要灰心。可能是网络阻塞了你的魔术包,多试几次(5+)。
    • UDP会丢包
    • 关机后的网卡接收包时并不是一直再监听的,可能是周期性唤醒接受一下
  • ip地址需要是域内的网关,例如ip 172.21.1.xxx的主机唤醒,ip需要填172.21.1.255
  • 记住,不要用于恶作剧。

结课!

恭喜你!你现在已经掌握了远程唤醒电脑的WOL技术,下次再面对有计算机利旧集群管理时,就不会手足无措啦~有些技术知道了便很简单呢

下次见,各位魔法师!祝你们魔力无边,代码无 bug!

这是新系列吧,好像我就是比较喜欢挖坑,内容主要是一些我觉得比较神奇小众的技术点,快速搞定业务顺便总结啦~

2cy

        YU.H 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余生H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值