基于NodeJS实现网络唤醒(Wake On Lan)

WOL的主要原理是向目标主机的网卡上发送一个特定结构的UDP包,如果目前网卡以及操作系统支持,则可以实现网络唤醒主机。

这个数据包的结构定义如下:

  1. 头部为6个0xFF。
  2. 后面跟着16次目标网卡MAC地址的重复。

总共102 Bytes的数据包。

具体细节可以参考Wikipedia:
https://en.wikipedia.org/wiki/Wake-on-LAN

下面是一个用TypeScript + NodeJS实现的网络唤醒程序。

import * as dgram from "dgram";

//TypeScript

var $socket: dgram.Socket = null;
var $magicPacket: Buffer;

//构建魔数包
function makeMagicPacket(mac: string): Buffer {
  let hex: string = "ffffffffffff";
  let result: Buffer;
  
  //重复16次mac地址
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;
  hex += mac;

  result = new Buffer(hex, "hex");
  return result;
}

function initSocket() {
  try {
    //构建魔数包 "224466881234" 为目标主机的活动网卡MAC地址
    $magicPacket = makeMagicPacket("224466881234");

    //创建UDP
    $socket = dgram.createSocket("udp4");

    if ($socket) {
      $socket.on("listening", () => {
        //启用广播
        $socket.setBroadcast(true);
        //广播魔数包
        $socket.send($magicPacket, 9, "255.255.255.255");
      });

      $socket.bind(0);
    }
  } catch (err) {
    console.error(err);
  }
}

function main() {
  initSocket();
}

main();

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据