由于偶尔要在外远程连接家里的电脑,家里的电脑一直都是开着的。电脑长期开着,有很长一段时间都是空闲的,不仅浪费电也会影响到硬件的寿命,因此希望能远程遥控,在有需要的时候唤醒主机。

通过查找资料,发现电脑主板是支持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 structapp = 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 mac == None:raise ValueErrorif not check_mac(mac):raise ValueErrorwake_on_lan(mac)response['code']=1response['message']='请求成功'except ValueError:response['code']=0response['message'] = '请输入正确的MAC地址'return jsonify(response)# 检查mac地址
def check_mac(mac_addr):# 长度检查if len(mac_addr) == 12:passelif len(mac_addr) == 17:mac_addr = mac_addr.replace(':', '')else:return False# 正则检查pattern = re.compile(r'[0-9A-Fa-f]{12}')result = pattern.match(mac_addr)if result is not None:return Trueelse:return Falsedef wake_on_lan(mac):if len(mac) == 12:passelif len(mac) == 17:macaddress = mac.replace(':', '')else:raise ValueError('mac地址有误')data = 'FFFFFFFFFFFF' + mac * 16byte_data = b''for i in range(0, len(data), 2):byte_dat = struct.pack('B', int(data[i: i + 2], 16))byte_data = byte_data + byte_datsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)sock.sendto(byte_data, ('255.255.255.255', 7))sock.close()if __name__ == '__main__':app.run(debug=False,port=5000,host='0.0.0.0')

templates/ index.html

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>远程唤醒</title><link rel="stylesheet" href="static/css/bootstrap.min.css" /><style type="text/css">body{padding-top: 50px;padding-bottom: 20px;}</style></head><body><nav class="navbar navbar-inverse navbar-fixed-top"><div class="container"><div class="navbar-header"><span class="navbar-brand">远程唤醒</span></div></div></nav><div class="container" style="padding-top: 20px;"><div class="row"><div class="col-md-12" id="prompt"><!--<div class="alert alert-danger"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>唤醒失败:</div>--></div></div><div class="row"><div class="col-xs-12 col-md-6 col-lg-6"><form id="form"><div class="form-group"><label for="mac_addr">MAC地址</label><input type="text" class="form-control" id="mac_addr" name="mac_addr" placeholder="请输入要唤醒的MAC地址"></div><button type="button" class="btn btn-default" id="submit_btn">提交</button></form></div></div><hr><footer><p>&copy; 2016 Company, Inc.</p></footer></div> <!-- /container --><script src="static/js/jquery-2.1.3.js"></script><script src="static/js/bootstrap.min.js"></script><script>$('#submit_btn').on('click',function(){$.ajax({type:"post",url:"wake",async:true,data:$('#form').serialize(),success:function(data){if(data.code == 1){$('#prompt').html('<div class="alert alert-success"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>请求成功</div>');}else if(data.code == 0){$('#prompt').html('<div class="alert alert-danger"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>请求失败:' + data.message + '</div>');}},error:function(){alert('error');},contentType:'application/x-www-form-urlencoded'});
//});</script></body>
</html>

部署运行:

复制到树莓派目录后,运行pythonapp.py,出现以下提示即运行成功。

* Running onhttp://0.0.0.0:5000/ (Press CTRL+C to quit)

如果报错,检查是否安装了flask及其依赖包。

成功运行后,在路由器上配置端口转发,即可从外网访问唤醒页面。外部端口为外网访问的端口地址,内部IP地址为树莓派的IP地址,内部端口为树莓派上flask运行的端口。如图设置后,即可通过http://IP地址:6000访问界面。

测试:

使用手机4G网络访问路由器公网的IP地址:6000,进入唤醒页面。输入主机的MAC地址,提交后即可启动主机。

参考:

http://blog.csdn.net/force_eagle/article/details/5630363

http://blog.csdn.net/u011913612/article/details/51833436

用树莓派实现远程唤醒相关推荐

  1. 示例:使用 Flv.js 和 Reflv 播放视频

    1.背景 传统的播放视频是采用 flash 播放器方式,然而各大浏览器厂商都不再支持flash , 我们不得不寻找其他解决方案. 2.说明 2.1 Flv.js flv.js 是一个HTML5 Fla ...

  2. 外网远程唤醒群晖NAS:路由器唤醒/内网树莓派唤醒/手机端WOL软件远程唤醒/网页工具唤醒

    一.内网区设置 1.电信光猫使用公网IP,设置桥接模式 2.路由器拨号上网,设置DDNS,开启远程管理(管理端口默认:8443)         https:/删除/XXXXXXXX.mynetgea ...

  3. 远程唤醒linux系统方法

    最近研究命令行下,远程唤醒(Wake On LAN)家里的windows台式机. linux下可以用etherwake这个软件,发送魔术封包(Magic Packet)远程唤醒机器. WOL远程唤醒还 ...

  4. 远程唤醒_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!

    有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器. 准备工作 本程序主要是实现远程管理 Windows10操作系统的开 ...

  5. 树莓派+SSH反向代理实现远程开机

    之前购买的向日葵开机棒出现了bug,客服给解决不了,想跟客服通个电话,客服表示不提供电话服务,无语.结果只能放在一边吃灰了.转念一想家里的树莓派可以用作远程唤醒,但是需要解决一个问题,就是内网穿透.何 ...

  6. 【树莓派】搭建OpenWrt软路由,并作为旁路由的配置与应用方法

    使用ARM架构做软路由,首要考虑的是价格问题,当树莓派作为ARM软路由,特别小巧但功能强大还静音,实乃绝配.这里我选用的是带有千兆网口的树莓派3B+,其优势主要主要有: 性能超过大部分ARM软路由 小 ...

  7. c# 远程网络唤醒电脑(电脑远程开机+内网MAC和IP扫描)(附带源码+主板和Windows开启详细说明+外网远程唤醒方案)

    一.需求 1.人在公司坐,昨晚写的文档放在家中电脑忘记Copy了,想要访问家中电脑拿到文档. 2.家中或公司中局域网内有某台电脑(或服务器)要开机,或者批量一键打开局域网内某些电脑 二.必备条件 1. ...

  8. VLOG丨树莓派Raspberry Pi 3安装PLEX并挂载USB硬盘打造最牛的微型家庭影音服务器2018...

    视频介绍 树莓派3安装目前最流行的PLEX服务器,实现既能最大限度降低功耗,也能随时随地观看分享影片. 一.在树莓派下安装PLEX媒体服务器 1.在终端,将你的树莓派更新至最新 sudo apt up ...

  9. gpio引脚介绍 树莓派3b_如何让LabVIEW程序运行在树莓派3B(此处有坑)

    上次转载了LabVIEW部署树莓派的文章后,很多小伙伴很兴趣,一个个都说要把压箱底的树莓派拿出来清下灰尘,也不知道到底拿出来没有. 放个之前文章链接如下: 零基础上手树莓派+免费正版LabVIEW C ...

最新文章

  1. java里注释为什么报错_这些年我们在java中遇到过的坑,你遇到过几个
  2. Windows10避开注册的方式安装sourceTree,Failed to connect to github.com port 443: Timed out问题解决
  3. python open读取_python,一读取文件open()
  4. nginx+php-fpm 502 bad gateway
  5. UE4之SetRelativeLocation 和SetRelativeRotation
  6. OpenAI对强化学习环境的汇总
  7. C#高级编程笔记(二)
  8. PowerShell在Exchange2010下快速开启邮箱[续]
  9. unity制作预制体,动态加载预制体,实用资源的导出
  10. ORACLE有EXCEL中trend函数,【Excel函数】TREND函数 - 曹海峰个人博客
  11. 测试工程师面试题整理
  12. Cesium 多边形(polygon)extrudedHeight 和 height 的区别
  13. X16 - 999、中国近代史纲要、03708
  14. 快速上手efficient(keras)
  15. sqlServer简单建数据库,建表操作
  16. 计算机左右手控制的按键,采用改进按键布局方法的计算机键盘技术
  17. 访问mega网盘 的方法
  18. python 添加半透明水印_怎么利用python给图片添加半透明水印
  19. 免费在线绘图软件推荐-processon
  20. Paddle网课小助手

热门文章

  1. 乐山计算机学校电子科技大学,乐山市计算机学校喜获电子科技大学网教先进
  2. CG100、CGDI、CGPRO区别介绍
  3. 刀具管理之首页性能优化
  4. IDEA插件【实用插件】
  5. 小程序源码-猫狗叫声模拟器
  6. Windows网络编程系列教程之四:Select模型
  7. Java的SSH网站
  8. AD画图软件各层的含义(嵌入式硬件篇)
  9. 转|周期矩形脉冲信号频谱及特点
  10. 《应用多元统计》计算样本均值向量,样本离差阵,样本协差阵,样本相关阵