5块钱不到的esp01s电脑远程开机
工具:esp01s、usbCH340串口烧录器
软件:Arduino IDE
通过巴法云创建主题,TCP协议订阅发送信息
代码
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <WiFiUdp.h>
// WiFi连接信息
const char* ssid = "CMCC-yaoyao"; // 替换为你的Wi-Fi名称
const char* password = "012345678"; // 替换为你的Wi-Fi密码
// 巴法云TCP配置
const char* host = "bemfa.com"; // 巴法云服务器地址
const int tcpPort = 8344; // 巴法云TCP端口(需确认,常见端口如 8344)
String uid = "2c0562b7437fd54aa9259365b928c1df"; // 替换为你的巴法云UID
String topic = "PCC001"; // 替换为你的设备主题
// 心跳间隔(巴法云要求心跳间隔需小于60秒)
const unsigned long heartBeatInterval = 50000; // 50秒发送一次心跳
unsigned long lastHeartBeat = 0;
// 电脑的MAC地址
uint8_t macAddress[] = {0x10, 0x7C, 0x61, 0x76, 0x6C, 0x93}; // 替换为你的电脑MAC地址
WiFiClient tcpClient; // TCP客户端对象
WiFiUDP udpClient; // UDP客户端(用于发送WoL魔术包)
// ========================== 初始化WiFi ==========================
void setupWiFi() {
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP: " + WiFi.localIP().toString());
}
// ========================== 发送Wake-on-LAN魔术包 ==========================
void sendWoL() {
uint8_t magicPacket[102];
// 前6字节为0xFF
memset(magicPacket, 0xFF, 6);
// 后续16次重复MAC地址
for (int i = 6; i < 102; i += 6) {
memcpy(&magicPacket[i], macAddress, 6);
}
udpClient.beginPacket("255.255.255.255", 9); // 广播地址和端口
udpClient.write(magicPacket, sizeof(magicPacket));
udpClient.endPacket();
Serial.println("[WoL] Magic packet sent.");
}
// ========================== 连接巴法云TCP服务器 ==========================
void connectToBemfa() {
Serial.println("Connecting to Bemfa TCP Server...");
if (tcpClient.connect(host, tcpPort)) {
Serial.println("Connected to server!");
// 发送订阅命令(格式:cmd=1&uid=xxx&topic=xxx)
String subscribeCmd = "cmd=1&uid=" + uid + "&topic=" + topic + "\r\n";
tcpClient.print(subscribeCmd);
Serial.println("Subscribed to topic: " + topic);
} else {
Serial.println("Connection failed!");
}
}
// ========================== 处理服务器消息 ==========================
void handleServerMessage(String msg) {
Serial.println("[Server] " + msg);
// 检查是否为控制命令(例如:&msg=on)
if (msg.indexOf("&msg=on") != -1) {
sendWoL(); // 发送开机魔术包
Serial.println("Trigger: PC Power ON");
} else if (msg.indexOf("&msg=off") != -1) {
// 可扩展:发送关机命令(需电脑端运行服务监听)
Serial.println("Trigger: PC Power OFF");
}
}
// ========================== 主程序 ==========================
void setup() {
Serial.begin(115200);
setupWiFi();
connectToBemfa();
}
void loop() {
// 检查TCP连接状态
if (!tcpClient.connected()) {
Serial.println("Connection lost, reconnecting...");
connectToBemfa();
delay(5000); // 等待5秒后重试
return;
}
// 处理服务器下发的数据
while (tcpClient.available()) {
String response = tcpClient.readStringUntil('\n');
handleServerMessage(response);
}
// 发送心跳包(格式:ping)
if (millis() - lastHeartBeat > heartBeatInterval) {
tcpClient.print("ping\r\n");
Serial.println("Sent heartbeat");
lastHeartBeat = millis();
}
delay(10); // 防止ESP8266看门狗触发
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Aix小僧
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果