WOL wake on lan 功能 nodejs android kotlin实现

21 篇文章 2 订阅

有些机器支持WOL功能,可以远程唤醒机器, 几乎所有品牌的硬件都支持WOL,由于安全原因,可能在软件上默认WOL处于关闭状态

原理

WOL(Wake on Lan),即局域网唤醒,从根本上来说是硬件设备提供的一项管理功能。该功能可以当电脑处于关机或休眠状态时,通过给网卡发送特定的数据包从而命令网卡向主板发送开机指令,进而实现上电开机。

程序向广播地址(255.255.255.255)发送一个特殊的UDP包

WOL工具

Magic Packet等,在目的以太网地址处填入机器的MAC地址,点击发送

在这里插入图片描述

nodejs 版本

/**
 * 通过魔术封包唤醒局域网计算机
 * @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]);
    }

    console.log('[long] bufRes: ', bufRes)
    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
        port: 9
    }, options);

    return new Promise((resolve, reject) => {
        const packet = createMagicPacket(mac);

        console.log('[long] packet: ', packet.length, '  ', packet)
        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);
            }
        );
    });
}

const mac = '34:F1:50:42:58:47'

wakeOnLAN(mac).then(
  res => {
      console.log(res);
  },
  err => {
      console.log(err.message);
  }
);

android kotlin版本

    fun wakeOnLan(mac: String) {
        thread {
            val macBytes = mac.split("-").map { it.toInt(16).toByte() }
            println(macBytes)
            val data = ByteArray(6 * 17) { if (it < 6) -1 else macBytes[it % 6] }
            DatagramSocket().run {
                send(DatagramPacket(data, data.size, InetAddress.getByName("255.255.255.255"), 9))
                close()
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的WOLWake on LAN)是一种远程开机技术,可以通过发送一个特定的数据包来唤醒处于休眠状态的计算机。WOL技术可以用于远程管理服务器、遥控电脑等场景。 在Android实现WOL需要以下步骤: 1. 获取待唤醒计算机的MAC地址; 2. 构建WOL数据包; 3. 发送WOL数据包。 以下是一个示例代码: ``` public void wakeOnLan(String macAddress) { try { byte[] macBytes = getMacBytes(macAddress); byte[] magicPacket = new byte[102]; for (int i = 0; i < 6; i++) { magicPacket[i] = (byte) 0xff; } for (int i = 6; i < magicPacket.length; i += macBytes.length) { System.arraycopy(macBytes, 0, magicPacket, i, macBytes.length); } InetAddress address = InetAddress.getByName("255.255.255.255"); DatagramPacket packet = new DatagramPacket(magicPacket, magicPacket.length, address, 9); DatagramSocket socket = new DatagramSocket(); socket.send(packet); socket.close(); } catch (Exception e) { e.printStackTrace(); } } private byte[] getMacBytes(String macAddress) throws IllegalArgumentException { String[] hex = macAddress.split(":"); if (hex.length != 6) { throw new IllegalArgumentException("Invalid MAC address."); } byte[] bytes = new byte[6]; for (int i = 0; i < 6; i++) { bytes[i] = (byte) Integer.parseInt(hex[i], 16); } return bytes; } ``` 在这个示例中,我们通过getMacBytes方法将MAC地址转换为字节数组,然后构建一个102字节的WOL数据包,并使用DatagramPacket发送到255.255.255.255:9地址。最后关闭DatagramSocket。 需要注意的是,在Android中需要声明网络权限: ``` <uses-permission android:name="android.permission.INTERNET" /> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值