如何优雅地开机

ZHLH 2021年12月20日 353次浏览

如何优雅地开机?

当你不在家,却想要给家里的电脑开机,你有以下几个方案:

让家里人帮忙

优点:可靠,有即时的反馈告诉你电脑状态
缺点:你得确保你家里有人,独居的朋友忽略这条

智能插座+上电自启

在bios里面设置好上电启动,当智能插座打开的时候电脑就自动开机了。不需要靠别人,自己随时能控制
不足之处是无法直接唤醒系统S3睡眠。另外还得额外用个智能插座来实现

开机棒

开机棒就是用一个MCU去控制你电脑的开机跳线,给MCU发送指令后导通主板跳线,机器开机。相当于帮你按了开机键
Wakener_taobao
缺点就是对电脑有侵入修改,如果你有多台电脑就要准备多个开机棒

局域网唤醒(Wake-on-LAN/WOL)

优点:可以自己控制,可以直接唤醒S3状态下的电脑,设备数量不限,只要在同一个广播域,都能唤醒
缺点:得在目标电脑广播域中有一个可以发唤醒包的设备,可以是路由器,旧手机,树莓派等等。。。

综合起来看,WOL的方案比较合适。因此某天跟某位不愿透露姓名的SwingFrog聊天的时候突发奇想,不如做一个小模块来实现WOL

WOL原理

如果在BIOS中打开了WOL功能,电脑处于关闭或者休眠状态时,有线网卡仍然保持供电,网卡会监听网络的广播信息,如果发现广播的数据包为Magic Packet,并且指定的MAC地址为本机时,网卡将通知电脑开始启动。

Magic Packet介绍

WOL唤醒数据包称为魔法数据包(Magic Packet),是一个广播帧,一般使用无状态的传输协议(如UDP),通过7或者9端口进行广播

Magic Packet的格式

魔法数据包的格式很简单:

Synchronization StreamTarget MACPassword (optional)
6960,4 or 6

开头是6个字节的0xFF,
紧接着是需要唤醒主机MAC地址,重复写16次,96个字节,
最后的密码是可选项,如果配置了就只能是4或者6个字节。如果为4字节密码,将会解析为IP地址,如果为6字节密码,将会解析为MAC地址。

设计

设计一个唤醒器,需要实现三个功能

  • 连上网络
  • 接受外部指令
  • 在内网中广播魔法数据包
    对应的,构思出整体结构:
    WakenerArch
    使用烂大街又好用又实惠的ESP8266作为主控,连上WIFI,订阅MQTT Topic,收到指令后通过wifi向局域网广播魔法唤醒包。

PCB

简单做一个USB供电的驱动电路,再加一个拨码开关,用于切换配置模式和正常工作模式。
BOM表如下

CommentDesignatorFootprintQuantity
SW_DIP_x01SW1,SW_SMT_1P1
10uFC1,C2,C_0603_1608Metric2
10KR1,R2,R3,R_0603_1608Metric3
RT9013-33GBU1,SOT-23-5_HandSoldering1
USB_AJ1,USB_A_CNCTech_1001-011-01101_Horizontal1
ESP-12FU2,ESP-12E1

Schematic:

成品做出来是这样的:

软件部分

给唤醒器设计了两种工作模式,当上电时候MCU检测拨码开关拨到ON,将会进入配置模式。
配置模式会开启AP,使用其他设备连接上去可以进行配置:

上电时拨码开关关闭时,将进入工作模式,MCU会连接WiFi、链接MQTT服务器、订阅MQTT topic
唤醒指令发下后,唤醒器将会在局域网中广播

总结

小小东西鸽了好久,还是太菜了。另外可以加个mos管,引出两个针脚,就可以实现开机棒的功能。
本项目的PCB和源码都托管在GitHub上:
https://github.com/ZHLHZHU/ESPWakener