ESP 物联网开发入门3:WOL唤醒
ESP 物联网开发入门3:WOL唤醒
在上一篇里,我们给电脑装了个“物理手指”来按开关。虽然稳,但总觉得不够科技感。如果你的主板支持,其实完全可以用一种更“黑客”的方式——**Wake on LAN (WOL)**。
简单来说,这就是给网卡发一个“暗号”,让它自己去叫醒整台电脑。
一、 什么是“魔术包”?
电脑关机后,只要电源没拔,网卡其实还在偷偷“值班”。它在等一个特定的数据包,也就是魔术包(Magic Packet)。
魔术包的结构很奇葩:6个 0xFF 后面跟着 16遍你的网卡 MAC 地址。网卡一旦在局域网里抓到这个组合,就会像打了鸡血一样瞬间触发开机。
二、 动手前的“三大关”
别急着烧录代码,WOL 最大的坑通常在配置上:
- BIOS 允许:开机狂按 F10(取决于电脑,我的是F10) 进入 BIOS,把
Wake on LAN或者Power On by PCI-E这种选项改成Enabled。 - 网卡允许:在 Windows 设备管理器里找到你的网卡,属性里的“电源管理”必须勾选“允许此设备唤醒计算机”。
- 必须插网线:绝大多数主板的内置 WiFi 关机后就断电了。所以,被唤醒的电脑必须插网线(ESP32 倒是可以用 WiFi 发包)。
- 当然了,有的无线网卡有WoWLAN功能,但好像听说效果一言难尽。
三、 终极合体代码
这段代码不仅能发 WOL 包,还保留了上一章的舵机控制。你可以通过 Blinker App 上的两个按钮,随心所欲选择开机方式。
C++
#define BLINKER_WIFI
#include <Blinker.h>
#include <Servo.h>
#include <WiFiUdp.h>
// 填入你的凭证
char auth[] = "你的Blinker Secret Key";
char ssid[] = "你的WiFi名字";
char pswd[] = "你的WiFi密码";
Servo myServo;
WiFiUDP udp;
// ===== 配置区 =====
byte mac[6] = {0x24,0xFB,0xE3,0x61,0x7A,0x37}; // 电脑的 MAC 地址
IPAddress broadcastIp(192,168,1,255); // 局域网广播地址
int wolPort = 9;
// 定义 App 里的按钮
BlinkerButton ButtonServo("btn-boot"); // 对应舵机按钮
BlinkerButton ButtonWOL("btn-wol"); // 对应 WOL 按钮
// ===== 发送魔术包的逻辑 =====
void sendWOL() {
byte magicPacket[102];
// 填充 6 个 0xFF
for(int i=0; i<6; i++) magicPacket[i] = 0xFF;
// 重复 16 次 MAC 地址
for(int i=1; i<=16; i++) memcpy(&magicPacket[i*6], mac, 6);
udp.beginPacket(broadcastIp, wolPort);
udp.write(magicPacket, 102);
udp.endPacket();
Serial.println("魔术包已发出!");
}
// ===== 按钮回调:网络唤醒 =====
void wol_callback(const String & state) {
Serial.println("收到 WOL 指令");
sendWOL();
}
// ===== 按钮回调:物理舵机 =====
void servo_callback(const String & state) {
Serial.println("收到舵机指令");
myServo.write(60); // 压下
Blinker.delay(500);
myServo.write(0); // 松开
}
void setup() {
Serial.begin(115200);
// 初始化舵机 (D1/GPIO5)
myServo.attach(5);
myServo.write(0);
Blinker.begin(auth, ssid, pswd);
udp.begin(9);
// 绑定 App 按钮
ButtonServo.attach(servo_callback);
ButtonWOL.attach(wol_callback);
}
void loop() {
Blinker.run();
}
四、 如何拿到 MAC 地址?
代码里那个 mac[6] 必须是你电脑的。找法很简单:
- 在你要唤醒的电脑上打开 CMD。
- 输入
ipconfig /all。 - 找到“以太网适配器”,里面的 物理地址(Physical Address) 就是它。
注意:要把横杠(-)改成代码里的
0x格式。
五、本系列总结
在这个系列中,我们使用 ESP32 实现了两种远程开机方案:
方案一:手指机器人
通过舵机模拟按下电源键。
方案二:Wake on LAN
通过网络发送魔术包唤醒电脑。
两种方案各有特点,但都可以实现同一个目标:
在世界任何地方远程启动自己的电脑。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 ZCP妙妙屋!




