本站改版新增arduino频道
#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.0092878341674805 seconds