ESP8266 Access Point – serwer TCP na socketach, przykładowy kod Arduino i MicroPython

Pytanie

ESP8266 server AP na socket-ach przykład

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • ESP8266 można uruchomić w trybie Access Point (AP), a następnie stworzyć serwer TCP (gniazda/sockets) – np. prosty echo-server lub własny protokół sterujący.
  • Wystarczy ustawić WiFi.mode(WIFI_AP), wywołać WiFi.softAP(ssid, password) i rozpocząć nasłuch obiektu WiFiServer.
  • Poniżej znajduje się kompletny, sprawdzony przykład (Arduino) oraz wariant MicroPython.

Szczegółowa analiza problemu

1. Kod – wariant Arduino (echo-server, port 1234)

#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:

  1. Access Point – niezależna sieć Wi-Fi (brak Internetu).
  2. WiFiServer – niskopoziomowy serwer TCP; nie używamy warstwy HTTP.
  3. Prosta wielosesyjność – cztery gniazda w tablicy.

2. Kod – wariant MicroPython (serwer HTTP na socketach, port 80)

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()

3. Teoretyczne podstawy

– 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.

4. Praktyczne zastosowania

– 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.


Aktualne informacje i trendy

– 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).


Wspierające wyjaśnienia i detale

  1. Konfiguracja statycznego IP AP:
    WiFi.softAPConfig(IPAddress(10,0,0,1), IPAddress(10,0,0,1), IPAddress(255,255,255,0));
  2. Ograniczenie liczby klientów:
    wifi_softap_set_max_conn(2);   // SDK API
  3. Diagnostyka: komenda Linux
    $ nc 192.168.4.1 1234
    Hello
    Hello
  4. Optymalizacja: włączenie server.setNoDelay(true) zmniejsza latencję Nagle.
  5. Watchdog: w długich pętlach należy wywołać yield() lub ESP.wdtFeed().

Aspekty etyczne i prawne

– 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.


Praktyczne wskazówki

  1. Kompilacja: ostatnie core ESP8266 v3.1.2 (2024-02) – poprawki stabilności TCP.
  2. Testowanie wydajności: iperf -c 192.168.4.1 -p 1234 -t 30 (potrzebny własny handler).
  3. Ogranicz wielkość pakietów do ≤1460 B (MTU Wi-Fi).
  4. Przy większej liczbie klientów przejdź na model zdarzeniowy (select() w lwIP) lub AsyncTCP.

Ewentualne zastrzeżenia lub uwagi dodatkowe

– 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).


Sugestie dalszych badań

  • Implementacja TLS (BearSSL) dla szyfrowanej wymiany kluczy.
  • WebSockety do przesyłania strumieni danych w czasie rzeczywistym.
  • Migracja kodu na ESP32 z obsługą Wi-Fi 6 (seria ESP32-C6).
  • Badanie wpływu kanału Wi-Fi i mocy TX na zasięg vs. zużycie energii.
  • Użycie FreeRTOS (ESP8266-RTOS-SDK) dla lepszej separacji zadań.

Krótkie podsumowanie

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.

Oceń odpowiedź:

Zadaj dodatkowe pytanie Sztucznej Inteligencji

Czekaj (1min)...
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.