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默认IPvoid 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);
}