WOL
WOL(Wake On LAN - 局域网唤醒)开机,虽然这个功能叫局域网唤醒,但与路由器的端口映射功能配合,广域网唤醒也是很容易的。只要有一台能上网的电脑或手机,就能把家中电脑打开,需要用家里电脑又不在家的时候很方便。
WOL配置
前提
- 主板支WOL,并且开启该功能。不同主板可以对应查询如何开启
- 唤醒发起请求的设备与电脑在同一个网段(公网需要端口映射等方式确保主机接收到请求)
获取主机MAC地址
ipconfig /all找到对应设备的mac地址,例如:AA:BB:CC:DD:AD:AA
唤醒配置
有很多种方式可以唤醒,下面提供的是思路。
iOS/Android
最简单的是在局域网内,通过APP来唤醒,市场可以搜索对应的APP(WOL)
群晖
如果有一台长期运行的NAS,那么通过nas则可以执行下面的命令来唤醒主机
执行/usr/syno/sbin/synonet --wake AA:BB:CC:DD:AD:AA eth0可以唤醒
Jenkins
基于上面的前提,每次访问nas后台执行命令还是有点费劲的,如果Nas上启动一个Jenkins,外网进行端口映射,能够访问Jenkins的话,然后配置Job,执行上面的命令,则也可以通过网页访问Jenkins,然后开机。
Siri
更加进一步,有时候网页访问还是很麻烦,可以配置Siri来执行快捷指令,调用jenkins的webhook,调用执行开机的Job。这样不论何时何地(公网或者内网),就可以通过siri直接语音唤起主机。
编码
当然如果动手能力强一点,也可以通过代码来实现,例如python代码
# -*- coding: utf-8 -*-
import socket
import struct
from traceback import print_exc
DEFAULT_PORT = 7
DEFAULT_BOARDCAST = '192.168.1.255'
def send_magic_packet(addr):
# create socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# parse address
mac_ = addr.upper().replace("-", "").replace(":", "")
if len(mac_) != 12:
raise Exception("invalid MAC address format: {}".format(addr))
buf_ = b'f' * 12 + (mac_ * 20).encode()
# encode to magic packet payload
magicp = b''
for i in range(0, len(buf_), 2):
magicp += struct.pack('B', int(buf_[i:i + 2], 16))
# send magic packet
print("sending magic packet for: {}".format(addr))
s.sendto(magicp, (DEFAULT_BOARDCAST, DEFAULT_PORT))
if __name__ == "__main__":
try:
# mac_addr = []
mac_addr = "12:34:56:78:90:AB"
send_magic_packet(mac_addr)
except BaseException:
print_exc()
上面提及更多是思路,或者说是我折腾的时候经历的过程,有很多其它类似的替代产品来实现,挑自己熟悉的就行。
目前我使用的路线是 Hi,Siri -> Jenkins Webhook -> shell -> 开机。
以上仅供参考