WOL

WOL全称为Wake-on-LAN,它的功效在于让休眠状态或关机状态的电脑,透过局域网的另一台电脑对其发令,使其唤醒、恢复成运作状态,或从关机状态转成引导状态[1]。

简单来说,WOL就是通过网络唤醒开启电脑。

原理

支持WOL的主板在通电时会监听并分析同一网络下的广播信息(xxx.xxx.xxx.255),在一般的局域网使用有限广播地址即可(255.255.255.255),当发现了“魔法包”(Magic Packet)就会对其进行解读。

魔法包是以广播的形式发送,作用于当前局域网(LAN),也可以是子网(Subnet)。

魔法包介绍

Magic Packet,是一种广播帧(frame),使用无连接协议,例如:UDP,发送的端口没有限制,可以使用任何端口进行发送,但一般约定俗成使用7或9号端口发送。大部分情况下,魔法包在数据链路层(OSI第2层)发送,使用广播地址进行广播,但也可以使用特定IP地址进行发送(OSI第3层)。

由于采用的是无连接协议,所以不保证数据包被目标机接收。

魔法包结构

魔法包最简单的构成是6个十六进制的255(ff ff ff ff ff ff)共6字节为数据包的头部标识,后面是目标机的十六进制MAC地址,并将MAC重复16次,到此数据包共102字节。有时数据包内还会紧接着4-6字节的密码信息。这个帧片段可以包含在任何协议中,最常见的是包含在 UDP 中。[2]

例如目标机MAC为:1a:2b:3c:4d:5e:6f

6字节头96字节信息=MAC信息x124-6字节密码(可空)
ff ff ff ff ff ff1a2b3c4d5e6f 1a2b3c4d5e6f 1a2b3c4d5e6f 1a2b3c4d5e6f 1a2b3c4d5e6f 1a2b3c4d5e6f 1a2b3c4d5e6f 1a2b3c4d5e6f 1a2b3c4d5e6f 1a2b3c4d5e6f 1a2b3c4d5e6f 1a2b3c4d5e6f密码

代码实现

我是用的是esp8266,刷入NodeMCU固件,是用LUA进行编程实现。

NodeMCU编译时起码需要编译netwifi两个模块,并正确配置和连上wifi。

mac = '1a2b3c4d5e6f'    -- 要进行目标主机的MAC地址

bip = '255.255.255.255' -- 路由器广播地址
head = 'FFFFFFFFFFFF'   -- 数据头
head = to(head)
mac = to(mac)
for i = 1, 16 do
    head = head .. mac
end
u = net.createUDPSocket()
u:send(1234, bip, head)    -- 是用9号端口
u:close()

-- 将两个一组字符串表示的十六进制转为十六进制的字符串
-- 'ff'(66 66) -> 0xff -> '.'(255)
function to(str)
    ret = ''
    for i = 1, string.len(str), 2 do
        byte = ('0x' .. string.sub(str, 0 + i, 1 + i))
        a = tonumber(byte)
        ret = ret .. string.char(a)
    end
    return ret
end

参考

Last modification:February 26, 2021
如果觉得我的文章对你有用,请随意赞赏