Node.js 实现局域网 Wake-on-LAN 唤醒功能

作者:慢半拍

时间:2026-10-25

浏览:122

本文介绍如何使用 Node.js 通过发送魔术封包(Magic Packet)来唤醒局域网内的计算机。文章提供了完整的代码实现,包括构建包含 MAC 地址的 UDP 数据包以及发送广播请求的具体步骤,帮助开发者快速掌握局域网远程开机技术。

文章目录

Node.js 局域网唤醒代码实现

本文分享使用 Node.js 发送魔术封包以唤醒局域网中计算机的具体代码实现。

/**
 * 通过魔术封包唤醒局域网计算机
 * @author 若海 <wang@rehiy.com>
 * @website http://www.rehiy.com
 * @wiki https://en.wikipedia.org/wiki/Wake-on-LAN
 * @docs http://support.amd.com/TechDocs/20213.pdf
 */
const net = require('net');
const udp = require('dgram');
/**
 * 创建魔术封包
 * @param {string} mac 网卡MAC地址
 * @returns {Buffer}
 */
function createMagicPacket(mac) {
    mac = mac.replace(/[^0-9a-fA-F]/g, '');
    if (mac.length != 12) {
        throw new Error(`Bad MAC address "${mac}"`);
    }
    const bufMac = Buffer.from(mac, 'hex');
    let bufRes = Buffer.alloc(6, 0xff);
    for (let i = 0; i < 16; i++) {
        bufRes = Buffer.concat([bufRes, bufMac]);
    }
    return bufRes;
}
/**
 * 通过网络唤醒
 * @param {string} mac 网卡MAC地址
 * @param {object} options 可选项
 * @returns {Promise<boolean>}
 */
function wakeOnLAN(mac, options) {
    options = Object.assign({
        address: '255.255.255.255',
        port: 7
    }, options);
    return new Promise((resolve, reject) => {
        const packet = createMagicPacket(mac);
        const socket = udp.createSocket(
            net.isIPv6(options.address) ? 'udp6' : 'udp4'
        );
        socket.on('error', function (err) {
            socket.close();
            reject(err);
        });
        socket.once('listening', function () {
            socket.setBroadcast(true);
        });
        socket.send(
            packet,
            0,
            packet.length,
            options.port,
            options.address,
            function (err, res) {
                socket.close();
                if (err) {
                    return reject(err);
                }
                resolve(res == packet.length);
            }
        );
    });
}

以下是一个简单的示例演示。

wakeOnLAN('30:9C:FF:FF:FF:FF').then(
    res => {
        console.log(res);
    },
    err => {
        console.log(err.message);
    }
);

以上是关于 Node.js 利用魔术封包唤醒局域网计算机实例的详细介绍,如需了解更多相关技术资料,建议查阅本站其他文章。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章