eps8266作为AP服务端 esp32c3作为STA客户端

eps8266作为AP服务端

上传代码后,ESP8266会创建热点

用手机/电脑连接ESP8266_AP热点

浏览器访问192.168.4.1/LED=ON/OFF控制LED

ESP8266通过串口转发指令到ESP32C3

复制代码
#include <ESP8266WiFi.h>
const char* ssid = "ESP8266_AP";
const char* password = "12345678";
WiFiServer webServer(80);
WiFiServer cmdServer(8080); // 指令服务端口
WiFiClient cmdClients[5];   // 最大5个客户端
bool ledState = false;

void setup() {
  Serial.begin(115200);
  WiFi.softAP(ssid, password);
  webServer.begin();
  cmdServer.begin();
  Serial.println("AP IP: " + WiFi.softAPIP().toString());
}

String sendHTML(){
  String ptr = "<!DOCTYPE html><html><head>";
  ptr += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";
  ptr += "<style>button{font-size:20px; padding:10px 20px;}</style></head>";
  ptr += "<body><h1>ESP8266 LED Control</h1>";
  ptr += "<p>LED Status: <strong>";
  ptr += (ledState)?"ON":"OFF";
  ptr += "</strong></p>";
  ptr += "<a href='/LED=ON'><button>Turn ON</button></a>";
  ptr += "<a href='/LED=OFF'><button>Turn OFF</button></a>";
  ptr += "</body></html>";
  return ptr;
}

void broadcastCommand(const String& cmd){
  for(int i=0; i<5; i++){
    if(cmdClients[i] && cmdClients[i].connected()){
      cmdClients[i].println(cmd);
      Serial.println("Sent: " + cmd);
    }
  }
}

void loop() {
  // 处理网页请求
  WiFiClient webClient = webServer.available();
  if(webClient){
    String request = webClient.readStringUntil('\r');
    if(request.indexOf("LED=ON") != -1){
      ledState = true;
      broadcastCommand("LED_ON");
    }else if(request.indexOf("LED=OFF") != -1){
      ledState = false;
      broadcastCommand("LED_OFF");
    }
    webClient.println("HTTP/1.1 200 OK");
    webClient.println("Content-Type: text/html");
    webClient.println();
    webClient.println(sendHTML());
    delay(10);
    webClient.stop();
  }

  // 处理指令客户端连接
  WiFiClient newClient = cmdServer.available();
  if(newClient){
    for(int i=0; i<5; i++){
      if(!cmdClients[i]){
        cmdClients[i] = newClient;
        Serial.println("New client connected");
        break;
      }
    }
  }
}

esp32c3作为STA客户端

复制代码
#include <WiFi.h>
const char* ssid = "ESP8266_AP";
const char* password = "12345678";
WiFiClient cmdClient;
const int ledPin = 12; // GPIO2
IPAddress serverIP(192,168,4,1); // AP默认IP

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
  
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnected to AP");
  
  while(!cmdClient.connect(serverIP, 8080)){
    delay(1000);
    Serial.println("Connecting to command server...");
  }
  Serial.println("Command channel ready");
}

void loop() {
  if(!cmdClient.connected()){
    cmdClient.connect(serverIP, 8080);
    delay(1000);
    return;
  }
  
  if(cmdClient.available()){
    String cmd = cmdClient.readStringUntil('\n');
    cmd.trim();
    Serial.println("Received: " + cmd);
    
    if(cmd == "LED_ON"){
      digitalWrite(ledPin, HIGH);
    }else if(cmd == "LED_OFF"){
      digitalWrite(ledPin, LOW);
    }
  }
  delay(10);
}