WOL远程开机——通过ESP8266+blinker(点灯)平台实现
之前疫情现在家里,无聊时改装家里的吸顶灯入网时,寻找了各种物联网平台,最终找到了blinker(点灯)这个物联网平台,APP很简洁,同时提供方便的API接口,非常适于DIY。
然后就是这次的想法,开学后已经搞好了Teamview远程连接自己的实验室电脑,使自己在宿舍也能科(hua)研(shui),但又因为实验室电脑总是开着,感觉不舒服(毕竟是自己配的机子,不舍得一直烧着)。于是想着怎么远程开关机,淘宝上的向日葵开机棒一个108,看了看原理,发现身为一个电子专业的科研狗,买了就是交智商税,刚好想到了用前面提到的平台,就可以实现远程开机,最后成本就8块钱(或者不要钱,我的ESP8266是本科玩剩下的,用不完就送学弟了)。
说明
本方法适合没公网IP的、没自己服务器的、没高级路由器的三无玩家,有以上几个的也可以这么搞,但没必要,毕竟(教程一堆):
- 宽带是公网IP的直接走内网映射
- 有腾讯云、阿里云服务器的直接走转发
- 有高级路由器的(带WOL功能)直接设置
但是如果图方便也可以
预备知识
- 计算机网络基本知识
- C语言基本知识
- Arduino编程经验(没有也行)
(如果是电子专业的,肯定没啥障碍)
所需材料和前提
前提
- 自己的电脑支持WOL
- 连着网的路由器
(没有上面两个前提的可以直接放弃)
材料
- 手机APP(blinker,Android & IOS 平台都有)
- ESP8266模块一个
调试下载工具
- Arduino IDE平台(编译用)
- USB转TTL模块(下载用)
原理
如果有上述提到的预备知识,则整体原理会非常简单,一句话概括就是手机APP端发送MQTT包到ESP8266,ESP8266转发WOL的UDP包到本地子网。
WOL
WOL(Wake On LAN) 局域网唤醒,顾名思义,是一种在局域网内唤醒PC的一种技术。其主要原理是向本地子网内的机器广播一个包含有目标机器网卡MAC地址的一个UDP包(WOL魔术包),所有接收到的机器解析包中的MAC地址,匹配成功的网卡发送对应命令,开启电脑。
Blinker平台
Blinker平台简介其官网有具体的介绍(链接在这),在此就大致说明一下本方法所用到的原理即可。
大致原理即如图所示,在局域网内网中,手机客户端直接通过局域网与ESP8266通讯,ESP8266接收到指令后进行WOL包的广播发送,在非局域网的远程连接中,ESP8266与Blinker服务器连接,同时手机客户端向Blinker服务器发送相关指令后,服务器转发给远端的ESP8266后,ESP8266发送WOL包唤醒电脑。
步骤
STEP1:设置WOL(实现内网唤醒)
WOL在BIOS中设置,具体的机器需要具体设置,就是在BIOS中打开一个选项开关,具体步骤自己在BIOS中找,我的电脑的设置如下:
其次就是在Windows中设置网卡的步骤,设置步骤如下:
首先在设备管理器中找到自己的以太网卡,找到连网线的那个网卡,进行如下操作:
然后继续在此页面下进行已下操作:
最后在网络和共享中心中查看自己网卡的MAC地址和IP地址:
全部设置正确后,便可以在本地局域网下进行设备唤醒了。
iOS下的Wolow软件可以进行测试,在手机连接路由器后(手机,电脑在同一个子网下,同时路由器没有开启AP隔离功能(一般都不开启)),进入对应设置,点击唤醒电脑就可以唤醒了。
注:最好在路由器中设置PC的IP与MAC绑定,方便后续的开机状态检查功能拓展,若不设置此项,开机功能可以用,但是可能无法进行设备开启状态检查!!!
Wolow软件设置如下:
首先添加新设备,界面如下:
接下来按照提示进行相关设置的填写,界面如下:
设置完成后进行测试,若PC没能启动检查是否有设置错误的地方,直到测试成功唤醒。
STEP2:ESP8266程序编写 + Blinker设置(实现外网唤醒)
先贴程序,对着程序进行解释:
/**
* 本项目简单的利用了blinker的Button例程,在客户端按下按键后,
* 通过MQTT通知ESP8266触发按键处理函数,按键处理函数主要负责
* 发送WOL的UDP魔术包,WOL魔术包格式如下
* FF FF FF FF FF FF ( XX XX XX XX XX XX (网卡的MAC地址)) x 16
* 包的总大小为 6+6*16 = 102 Byte
*/
#define BLINKER_WIFI
#include <Blinker.h>
//对应客户端的秘钥
char auth[] = "************";
//WIFI SSID
char ssid[] = "XXXX";
//WIFI Password
char pswd[] = "XXXX";
#define BUTTON_1 "OPEN"
WiFiUDP Udp;
//网卡的IP地址
const IPAddress remote_ip(192, 168, 0, 1);
//根据自己的路由器选择子网段的广播地址
#define BROADCAST_ADD "192.168.1.255"
//网卡唤醒端口(一般为9或7,可以在BIOS中查看)
#define REMOTEPORT 9
//ESP8266端口,随便填一个,也填成9
#define LOCALPORT 9
//网卡的MAC地址 6个字节
char NETCARD_MAC[6] = {
0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
//WOL包
char WOL_Buffer[102];
//调试开关
//#define WOL_DEBUG
//WOL魔术包初始化
void WOL_packet_init()
{
int i,j;
for(i=0;i<6;i++)
{
WOL_Buffer[i] = 0xFF;
}
for(i=