WOL的主要原理是向目标主机的网卡上发送一个特定结构的UDP包,如果目前网卡以及操作系统支持,则可以实现网络唤醒主机。
这个数据包的结构定义如下:
- 头部为6个0xFF。
- 后面跟着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();