ESP8266 server AP na socket-ach przykład
WiFi.mode(WIFI_AP)
, wywołać WiFi.softAP(ssid, password)
i rozpocząć nasłuch obiektu WiFiServer
. #include <ESP8266WiFi.h>
const char* ssid = "ESP8266_AP";
const char* password = "12345678";
const uint16_t PORT = 1234;
WiFiServer server(PORT);
WiFiClient clients[4]; // tablica na maks. 4 jednoczesne sesje
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password);
Serial.print("AP IP: "); Serial.println(WiFi.softAPIP());
server.begin();
server.setNoDelay(true); // minimalizacja opóźnień TCP
}
void loop() {
/* 1. Akceptowanie nowych klientów */
WiFiClient newClient = server.available();
if (newClient) {
for (auto &c : clients) {
if (!c || !c.connected()) { c = newClient; break; }
}
Serial.printf("Nowe połączenie: %s\n", newClient.remoteIP().toString().c_str());
}
/* 2. Obsługa już podłączonych klientów */
for (auto &c : clients) {
if (!c || !c.connected()) continue;
while (c.available()) { // dane od klienta
char ch = c.read();
Serial.write(ch); // log na UART
c.write(ch); // echo
}
/* 3. Timeout 30 s braku ruchu */
static uint32_t lastActivity[4] = {0};
int idx = &c - clients;
lastActivity[idx] = millis(); // aktualizacja licznika
if (millis() - lastActivity[idx] > 30000) {
c.stop();
Serial.println("Timeout – klient rozłączony");
}
}
}
Kluczowe elementy:
WiFiServer
– niskopoziomowy serwer TCP; nie używamy warstwy HTTP. import network, socket
ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(essid="MP_AP", password="123456789")
print("AP IP:", ap.ifconfig()[0])
html = b"""HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n
<html><body><h1>Hello from ESP8266</h1></body></html>"""
s = socket.socket()
s.bind(('', 80))
s.listen(4)
while True:
conn, addr = s.accept()
print("Client:", addr)
_ = conn.recv(1024) # pobierz zapytanie
conn.send(html) # wyślij odpowiedź
conn.close()
– Tryb AP korzysta z wewnętrznego DHCP (domyślnie podsieć 192.168.4.0/24).
– Socket TCP = strumień bajtów; producent protokołu pozostaje po stronie aplikacji.
– ESP8266 ma ~50 kB RAM-u użytkowego ⇒ każdy otwarty socket to ~3–4 kB buf.
– Sterowanie urządzeniami offline (oświetlenie, HVAC) w środowisku bez routera.
– Konfiguratory „captive” (użytkownik łączy się z AP i wprowadza dane).
– Transfer danych z czujników w miejscu bez infrastruktury.
– Coraz częściej stosuje się biblioteki asynchroniczne: ESPAsyncTCP
, ESPAsyncWebServer
; pozwalają na większą wydajność i WebSockety.
– W nowych projektach IoT migruje się na ESP32-C3/S3 (Wi-Fi 4 + BT 5) – kod identyczny, zasoby x4.
– Popularny jest model „SoftAP + STA” (jednoczesny AP i połączenie do routera).
WiFi.softAPConfig(IPAddress(10,0,0,1), IPAddress(10,0,0,1), IPAddress(255,255,255,0));
wifi_softap_set_max_conn(2); // SDK API
$ nc 192.168.4.1 1234
Hello
Hello
server.setNoDelay(true)
zmniejsza latencję Nagle. yield()
lub ESP.wdtFeed()
. – Sieć AP powinna być zabezpieczona (WPA2-PSK).
– Przesyłane dane nie są szyfrowane na warstwie TCP → wrażliwe informacje lepiej tunelować (TLS, ESP8266BearSSL).
– ESP8266 pracuje w paśmie ISM 2,4 GHz – w UE obowiązuje dyrektywa RED; przy projektach komercyjnych wymagana jest ocena zgodności i znak CE.
– Rejestrowanie danych użytkownika (np. adresów MAC) podlega RODO.
iperf -c 192.168.4.1 -p 1234 -t 30
(potrzebny własny handler). select()
w lwIP) lub AsyncTCP. – 160 MHz CPU zwiększa throughput, ale podnosi pobór prądu.
– Pamięć heap może się fragmentować – warto monitorować ESP.getFreeHeap()
.
– Przy ruchu binarnym zwracaj uwagę na endianess (ESP8266 = little-endian).
ESP8266 w trybie Access Point może pełnić funkcję niezależnego serwera TCP opartego na socketach. Przykładowy kod (Arduino i MicroPython) pokazuje, jak uruchomić AP, przyjmować wielu klientów oraz realizować echo-server lub prosty serwer HTTP. Kluczowe są: zarządzanie pamięcią, bezpieczeństwo (WPA2 + ewentualny TLS) i testy obciążeniowe. Dzięki bibliotekom asynchronicznym oraz nowszym układom (ESP32-C3/S3) można znacznie zwiększyć skalowalność i funkcjonalność przyszłych projektów.