由于偶尔要在外远程连接家里的电脑,家里的电脑一直都是开着的。电脑长期开着,有很长一段时间都是空闲的,不仅浪费电也会影响到硬件的寿命,因此希望能远程遥控,在有需要的时候唤醒主机。
通过查找资料,发现电脑主板是支持WOL(Wake-On-Lan)唤醒。在开启主板的WOL功能后,网卡会监听连路上的数据包,如果接收到特定的数据包,则唤醒主机。
这种数据包叫做magic packet,通常通过UDP协议承载,使用的端口号为7或者9。Magic packet包内容前6个字节为FF FF FFFF FF FF,紧跟着是16次要唤醒主机网卡的MAC地址,有6*12=72个字节。例如网卡MAC地址为D4:3D:7A:11:2E:B7,则magic packet包的内容为:
FF FF FF FF FFFF D4 3D 7A 11 2E B7 D4 3D 7A 11 2E B7
D4 3D 7A 11 2E B7D4 3D 7A 11 2E B7 D4 3D 7A 11 2E B7
D4 3D 7A 11 2E B7D4 3D 7A 11 2E B7 D4 3D 7A 11 2E B7
D4 3D 7A 11 2E B7D4 3D 7A 11 2E B7 D4 3D 7A 11 2E B7
D4 3D 7A 11 2E B7D4 3D 7A 11 2E B7 D4 3D 7A 11 2E B7
D4 3D 7A 11 2E B7D4 3D 7A 11 2E B7
在这里使用WEB进行控制,使用flask作为WEB的服务端。如果宽带拨号拿到的是公网IP,在路由器上设置端口映射后就可以通过浏览器实现远程开机。如果拿不到公网IP,可以通过花生壳一类的软件实现公网访问。
代码:
app.py
# -*- coding:utf-8 -*-
from flask import Flask,render_template,request,jsonify
import re
import socket
import struct
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/wake', methods=['POST'])
def wake():
response = {}
try:
mac = request.values.get('mac_addr')
if