1. 工具:esp01s、usbCH340串口烧录器

  2. 软件:Arduino IDE

  3. 通过巴法云创建主题,TCP协议订阅发送信息

  4. 代码

#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看门狗触发
}