问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://m.blog.csdn.net/m0_38015699/article/details/142546675

WOL用途

Wake on LAN(WOL)技术可以用于远程唤醒局域网内的休眠或关机主机,这在计算机集中管理场景中非常实用。例如,在学校电教室中,管理员可以通过WOL技术一键开启所有电脑,而无需逐一手动开机。

魔法原理

WOL的原理是通过发送一个特殊的网络数据包(称为"魔术包")来实现的。这个数据包包含了目标主机网卡的MAC地址。当目标主机的网卡接收到这个数据包时,就会被唤醒并启动系统。

准备材料

  • Node.js环境
  • 支持WOL功能的电脑
  • 目标电脑的MAC地址
  • BIOS配置

在进入BIOS设置时,需要注意不同主机的快捷键可能不同,有的是F1,有的是F2,有的需要按下Fn键。经过测试,大多数主机的BIOS默认都是开启WOL功能的。但是,对于笔记本电脑,需要检查是否开启了省电模式,因为省电模式可能会影响WOL功能的正常工作。

编写代码

下面是一个使用Node.js实现WOL功能的示例代码:

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,那么广播地址应该是172.21.1.255。
  • 使用WOL技术时,请确保不要将其用于恶作剧或其他不当用途。

结语

通过本文的学习,你已经掌握了Wake on LAN技术的基本原理和实现方法。这项技术在计算机集中管理场景中非常实用,可以帮助管理员更高效地管理大量主机。希望本文对你有所帮助,祝你在技术探索的道路上越走越远!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号