ESP 物联网开发入门3:WOL唤醒

在上一篇里,我们给电脑装了个“物理手指”来按开关。虽然稳,但总觉得不够科技感。如果你的主板支持,其实完全可以用一种更“黑客”的方式——**Wake on LAN (WOL)**。

简单来说,这就是给网卡发一个“暗号”,让它自己去叫醒整台电脑。

一、 什么是“魔术包”?

电脑关机后,只要电源没拔,网卡其实还在偷偷“值班”。它在等一个特定的数据包,也就是魔术包(Magic Packet)

魔术包的结构很奇葩:6个 0xFF 后面跟着 16遍你的网卡 MAC 地址。网卡一旦在局域网里抓到这个组合,就会像打了鸡血一样瞬间触发开机。

二、 动手前的“三大关”

别急着烧录代码,WOL 最大的坑通常在配置上:

  1. BIOS 允许:开机狂按 F10(取决于电脑,我的是F10) 进入 BIOS,把 Wake on LAN 或者 Power On by PCI-E 这种选项改成 Enabled
  2. 网卡允许:在 Windows 设备管理器里找到你的网卡,属性里的“电源管理”必须勾选“允许此设备唤醒计算机”。
  3. 必须插网线:绝大多数主板的内置 WiFi 关机后就断电了。所以,被唤醒的电脑必须插网线(ESP32 倒是可以用 WiFi 发包)。
  4. 当然了,有的无线网卡有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] 必须是你电脑的。找法很简单:

  1. 在你要唤醒的电脑上打开 CMD。
  2. 输入 ipconfig /all
  3. 找到“以太网适配器”,里面的 物理地址(Physical Address) 就是它。

注意:要把横杠(-)改成代码里的 0x 格式。

五、本系列总结

在这个系列中,我们使用 ESP32 实现了两种远程开机方案:

方案一:手指机器人

通过舵机模拟按下电源键。

方案二:Wake on LAN

通过网络发送魔术包唤醒电脑。

两种方案各有特点,但都可以实现同一个目标:

在世界任何地方远程启动自己的电脑。