需求来源
买了个30块钱破小机箱装配上了i3-12100F+二手1650s很般配,用了一段时间发现开机键偶尔开不了机,新主板不太可能会坏啊,拆出来用短接法果然秒开,排查结果就是破机箱电源开关坏了,网上一搜各种花里胡哨的开机键卖,虽然换上不难,但是不太优雅了,心想干脆用手机打开吧,使用板载网卡网络唤醒不就行了
实现方式
第一步当然是开启主板的网络唤醒功能,一般进入主板BIOS都有地方设置,不同品牌主板设置地方不太一样,需要自己百度搜搜。
第二步电脑关机尝试唤醒,这里你可以微信小程序搜索一下“网络唤醒”小程序,有些小程序可以输入电脑MAC地址在局域网内唤醒指定电脑,但是我没用过,因为打开微信找到小程序再去唤醒还是不够优雅
如果测试通过可以唤醒的话,就可以尝试其他唤醒方式,比如:如果你的路由器支持安装插件,或者本身有唤醒功能,那么可以直接用,但是我没用过,因为依旧不够优雅。。。
这里我我在网上搜索了一下网络唤醒的原理,其实就是给局域网广播一个数据包,具体可以自己搜索一下,于是写了以下Python脚本:
#!/usr/bin/python3
# -*- coding=utf8 -*-
import socket
import struct
import sys
def WOL(mac_address):
if len(mac_address) == 12:
pass
elif len(mac_address) == 12 + 5:
sep = mac_address[2]
mac_address = mac_address.replace(sep, '')
else:
raise ValueError('Incorrect MAC address format')
data = ''.join(['FFFFFFFFFFFF', mac_address * 16])
send_data = b''
for i in range(0, len(data), 2):
byte_dat = struct.pack('B', int(data[i: i + 2], 16))
send_data = send_data + byte_dat
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(send_data, ('192.168.5.255', 9))
sock.close()
'''
网络唤醒
'''
if name == '__main__':
mac = None
if len(sys.argv) < 2:
mac = 'D8:43:AE:76:0B:4C'
else:
mac = sys.argv[1]
if mac is None:
print("请传入MAC地址")
exit()
WOL(mac)
其中WOL函数是核心的唤醒代码,传局域网内mac地址,即可唤醒指定电脑,里面有个地址192.168.5.255,是我家的路由器的广播地址,如果你的路由器地址是192.168.1.1,那么广播地址应该是192.168.1.255,根据实际情况进行修改。入口函数支持传一个参数mac地址,当然也可以不传,我这里不传就用“D8:43:AE:76:0B:4C”,这是我家电脑的mac地址
好了,现在把这个脚本丢到路由器里直接执行就能唤醒电脑了,前提是路由器支持Python,但是这样做有什么好处呢,还不是通过路由器唤醒,这时就不得不提iphone上的一款神器:快捷指令,配置快捷指令如下:
选择了脚本-通过SSH运行脚本,填写了你路由器的ssh连接方式,我这里把路由器的ssh端口映射到了外网,并且做了DDNS绑定了域名,这样我就可以在外网随时打开家里电脑了,一般不太推荐这么搞,容易被攻击,我比较勇无所畏惧-_-
好了,现在可以用手机的快捷指令功能打开电脑了,快捷指令最大的好处是可以使用siri启动,现在我在任何地方都可以对手机说:hi siri 电脑开机,然后我的电脑就开机了,总算够优雅了。。。
评论区