本站改版新增arduino频道

Micropython
Arduino

arduino esp32 唤醒局域网 电脑


#include <WiFi.h>
#include <WiFiUdp.h>

// WiFi 网络配置
const char* ssid = "你的WiFi名称";       // WiFi SSID
const char* password = "你的WiFi密码";   // WiFi 密码

// 广播地址和端口
const char* broadcastIP = "255.255.255.255"; // 广播地址
const int port = 9;                         // WOL 默认端口

WiFiUDP udp;

void setup() {
  Serial.begin(115200);

  // 连接到 WiFi
  Serial.println("正在连接到 WiFi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("\nWiFi 已连接");
  Serial.print("IP 地址: ");
  Serial.println(WiFi.localIP());

  // 调用封装的 WOL 函数
  String macAddress = "C8-4D-44-23-30-20"; // 替换为目标电脑的 MAC 地址
  sendWOL(macAddress);
}

void loop() {
  // 空循环
}

// 函数:发送 WOL 魔术包
void sendWOL(String macAddress) {
  byte mac[6]; // 存储解析后的 MAC 地址

  // 解析 MAC 地址字符串
  if (!parseMacAddress(macAddress, mac)) {
    Serial.println("MAC 地址解析失败");
    return;
  }

  byte magicPacket[102]; // 魔术包大小为 102 字节

  // 前 6 字节填充为 0xFF
  for (int i = 0; i < 6; i++) {
    magicPacket[i] = 0xFF;
  }

  // 接下来 16 次重复目标 MAC 地址
  for (int i = 1; i <= 16; i++) {
    for (int j = 0; j < 6; j++) {
      magicPacket[i * 6 + j] = mac[j];
    }
  }

  // 开始广播魔术包
  udp.beginPacket(broadcastIP, port);
  udp.write(magicPacket, sizeof(magicPacket));
  udp.endPacket();

  Serial.println("WOL 魔术包已发送");
}

// 函数:解析 MAC 地址字符串
bool parseMacAddress(String macAddress, byte* mac) {
  if (macAddress.length() != 17) {
    return false; // MAC 地址长度不正确
  }

  for (int i = 0; i < 6; i++) {
    // 提取每个字节的字符串
    String byteString = macAddress.substring(i * 3, i * 3 + 2);
    mac[i] = (byte) strtol(byteString.c_str(), NULL, 16); // 转换为十六进制字节
  }

  return true;
}



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 ESP56.com All Rights Reserved
晋ICP备14006235号-22 晋公网安备14108102001165号

执行时间: 0.0096220970153809 seconds