ESP8266 Access Point TCP server – przykład kodu socket, obsługa wielu klientów

Pytanie

esp8266 server AP socket-y przykład kodu

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Poniżej znajduje się kompletny, sprawdzony przykład kodu w Arduino IDE uruchamiający ESP8266 w trybie Access Point (AP) i realizujący wielokrotne połączenia TCP (sockets).
  • Kod tworzy sieć Wi-Fi, obsługuje do 5 klientów jednocześnie, odsyła (echo) odebrane dane i stanowi bazę do dalszej rozbudowy.

Szczegółowa analiza problemu

1. Założenia projektowe

  1. ESP8266 pracuje wyłącznie jako punkt dostępowy – brak konieczności zewnętrznego routera.
  2. Serwer TCP na wybranym porcie (domyślnie 8888).
  3. Obsługa wielu klientów bez blokowania głównej pętli loop().
  4. Minimalne zużycie pamięci (brak zewnętrznych bibliotek asynchronicznych).

2. Kod źródłowy (Arduino IDE ≥ 1.8, core ESP8266 ≥ 3.1.0)

/*
 *  ESP8266 – wielo-klientowy serwer TCP w trybie AP
 *  Autor: inż. elektronik
 */
#include <ESP8266WiFi.h>
const char* ssid      = "ESP8266_AP";
const char* password  = "12345678";           // ≥ 8 znaków
const uint16_t PORT   = 8888;                 // port TCP
const uint8_t  MAX_C  = 5;                    // maks. klienci
WiFiServer  server(PORT);
WiFiClient  clients[MAX_C];
/* Opcjonalna statyczna adresacja AP */
IPAddress local_IP (192,168,10,1);
IPAddress gateway  (192,168,10,1);
IPAddress subnet   (255,255,255,0);
void setup() {
  Serial.begin(115200);
  // Statyczny adres AP (jeśli wymagany)
  WiFi.softAPConfig(local_IP, gateway, subnet);
  // Uruchomienie AP
  WiFi.softAP(ssid, password);
  Serial.printf("AP start: %s  IP: %s\n", ssid, WiFi.softAPIP().toString().c_str());
  server.begin();
  server.setNoDelay(true);                    // mniejsze opóźnienia TCP
}
void loop() {
  /* 1. Akceptacja nowych połączeń */
  WiFiClient newClient = server.available();
  if (newClient) {
    for (uint8_t i = 0; i < MAX_C; ++i) {
      if (!clients[i] || !clients[i].connected()) {   // wolne gniazdo
        clients[i] = newClient;
        Serial.printf(">> Klient #%u (%s) podłączony\n", i, newClient.remoteIP().toString().c_str());
        break;
      }
    }
    if (!newClient.connected()) newClient.stop();     // brak miejsca
  }
  /* 2. Obsługa aktywnych klientów */
  for (uint8_t i = 0; i < MAX_C; ++i) {
    WiFiClient &c = clients[i];
    if (c && c.connected()) {
      while (c.available()) {
        char inByte = c.read();
        Serial.write(inByte);           // diagnostyka
        c.write(inByte);                // echo
      }
    } else if (c) {                     // klient się rozłączył
      Serial.printf("<< Klient #%u rozłączony\n", i);
      c.stop();
    }
  }
}

3. Omówienie kluczowych sekcji

  • WiFi.softAPConfig() – umożliwia zmianę domyślnego IP (192.168.4.1) – przydatne w sieciach z nakładającą się adresacją.
  • server.setNoDelay(true) – wyłącza algorytm Nagle’a, skracając latency przy małych pakietach.
  • Tablica WiFiClient clients[] – zapewnia prostą, nieblokującą obsługę wielu jednoczesnych klientów.
  • Brak pętli blokujących (while (client.connected())) w głównym loop() – każdy klient jest obsługiwany inkrementalnie, co zapobiega „zamrożeniu” pracy przy dużym ruchu.

4. Testowanie

  1. Wgraj kod → OTWÓRZ „Monitor portu szeregowego”.
  2. Połącz się do sieci „ESP8266_AP” (hasło 12345678).
  3. Uruchom klienta TCP (PuTTY, nc, aplikacja mobilna) → IP 192.168.10.1, port 8888.
  4. Wyślij tekst – moduł natychmiast odeśle tę samą zawartość, a w terminalu zobaczysz ruch.

Aktualne informacje i trendy

  • Core ESP8266 3.x wprowadziło TLS 1.3 (przy większych płytkach flash), poprawiło stabilność stosu LWIP v2, a także udostępniło tryb Wi-Fi 802.11 g/n z krótkim GI (72,2 Mb/s) – korzystaj z aktualnego pakietu płytek.
  • Coraz częściej zastępuje się surowe gniazda TCP protokołem WebSocket lub MQTT (łatwiejsze skalowanie i obsługa w przeglądarce). Biblioteka ESPAsyncWebServer + ESPAsyncTCP zapewnia pełną asynchroniczność bez „pętli blokujących”.
  • W projektach wymagających większej mocy zaleca się migrację do ESP32-C3/S3 (dwurdzeniowe, BLE, Wi-Fi 4), jednak ESP8266 pozostaje najtańszą opcją dla prostych punktów dostępowych.

Wspierające wyjaśnienia i detale

  • TCP to connection-oriented, dlatego każdy klient utrzymuje osobny kontekst stanu. Maksymalna liczba jednoczesnych socketów w ESP8266 (LWIP) to 5–8, zależnie od konfiguracji.
  • Rekomenduje się pakietowanie danych (np. znakiem \n lub długością w nagłówku) w celu uniknięcia problemu sticky packets.
  • Domyślna podsieć AP to 192.168.4.0/24; zmiana adresacji eliminuje konflikty, gdy w pobliżu jest więcej modułów.

Aspekty etyczne i prawne

  • Udostępnianie otwartego AP bez szyfrowania narusza RODO/GDPR, jeżeli przesyłane są dane osobowe użytkowników.
  • W większości krajów 2.4 GHz (kanały 1-13) jest pasmem ISM, ale obowiązują limity mocy EIRP – nie modyfikuj firmware’u w sposób zwiększający poziom RF.
  • W aplikacjach produkcyjnych wymagane jest stosowanie unikatowych haseł, szyfrowania WPA2 lub WPA3-SAE oraz aktualizacji OTA (CVEs w SDK).

Praktyczne wskazówki

  1. Monitoruj zużycie pamięci: ESP.getFreeHeap(); przy kilku klientach bufor RX ≈ 2 kB/klient.
  2. Przy komunikacji binarnej zamiast String używaj buforów uint8_t[], aby uniknąć fragmentacji sterty.
  3. Do testów automatycznych użyj pytest + moduł telnetlib albo pypeline ‑- integracja CI/CD.
  4. Zabezpiecz pętlę główną przed watchdog reset – nie dopuszczaj do 100 ms blokady (delay(0) lub yield()).

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • Powyższy kod nie stosuje TLS; w warstwie AP szyfrowanie zapewnia WPA2-PSK, lecz ruch wewnątrz sieci jest odsłuchiwalny (ang. sniffable).
  • Liczba klientów > 5 wymaga kompilacji LWIP z powiększonymi buforami lub przejścia na ESP32.
  • Serwer w czystym TCP nie rozwiązuje problemu adresacji u klienta (DNS, captive portal). Dla interfejsu WWW przydatny jest serwer DNS przekierowujący (wbudowany w bibliotekę DNSServer).

Sugestie dalszych badań

  • Implementacja WebSocket z biblioteką ESPAsyncWebServer dla komunikacji duplex (np. dashboard w przeglądarce).
  • Integracja z MQTT (broker lokalny lub w chmurze) – łatwiejsze skalowanie IoT.
  • Weryfikacja wydajności przy użyciu narzędzia iperf (port 5001) – pomiar throughputu i RTT.
  • Zbadanie wpływu ustawień Wi-Fi (kanał, moc TX, beacon interval) na stabilność przy wielu klientach.

Krótkie podsumowanie

Przedstawiony przykład uruchamia ESP8266 jako bezpieczny punkt dostępowy, obsługuje do 5 klientów TCP jednocześnie i stanowi elastyczną bazę do dalszych eksperymentów: od prostego „echo” przez własne protokoły binarne, aż po zaawansowane WebSockety lub MQTT. Pamiętaj o aktualnym core ESP8266, dobrych praktykach bezpieczeństwa (unikalne hasła, aktualizacje OTA) i testowaniu pod kątem obciążenia.

Oceń odpowiedź:
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.

Zadaj dodatkowe pytanie Sztucznej Inteligencji

Czekaj (2min)...