ESP8266 Access Point – fetch() POST JSON do serwera, przykładowy kod Arduino IDE

Pytanie

ESP8266 server AP, wysłanie danych ze strony metodą fetch() przykładowy kod

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Poniżej znajduje się kompletny, minimalny przykład:
    • ESP8266 w trybie Access Point serwuje stronę HTML umieszczoną w PROGMEM.
    • Strona wysyła dane JSON do endpointu /api metodą fetch(…{method:'POST'}…).
    • ESP8266 odbiera „raw body” (server.arg("plain")) i zwraca odpowiedź JSON.
  • Kod działa w Arduino IDE ≥ 3.1.2 z biblioteką ESP8266WebServer.h.
/* =====  ESP8266  ===== */
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>          // do parsowania (opcjonalnie)
const char* ssid     = "ESP-AP";
const char* password = "12345678";
ESP8266WebServer server(80);
/* ——— Strona HTML w pamięci Flash ——— */
const char HTMLpage[] PROGMEM = R"rawlit(
<!DOCTYPE html><html lang="pl">
<head><meta charset="UTF-8"><title>fetch() → ESP8266</title></head>
<body>
  <h2>Wpisz wiadomość i wyślij do ESP8266</h2>
  <input  id="msg" value="Hello ESP8266"><button onclick="send()">Wyślij</button>
  <pre id="log"></pre>
<script>
async function send(){
  const txt = document.getElementById('msg').value;
  try{
    const r = await fetch('/api', {
      method:'POST',
      headers:{'Content-Type':'application/json'},
      body: JSON.stringify({msg:txt, t:Date.now()})
    });
    document.getElementById('log').textContent = await r.text();
  }catch(e){console.error(e);}
}
</script></body></html>
)rawlit";
void handleRoot() { server.send_P(200,"text/html",HTMLpage); }
void handleAPI() {
  if(!server.hasArg("plain")){ server.send(400,"text/plain","Brak danych"); return; }
  String body=server.arg("plain");
  Serial.println("RX: "+body);
  // (opcjonalnie) parsowanie JSON
  StaticJsonDocument<200> doc;
  deserializeJson(doc, body);
  const char* txt = doc["msg"] | "";

  String resp = "{\"status\":\"OK\",\"echo\":\""+String(txt)+"\"}";
  /* Nagłówki CORS – gdyby strona była poza ESP */
  server.sendHeader("Access-Control-Allow-Origin","*");
  server.send(200,"application/json",resp);
}
void setup() {
  Serial.begin(115200);
  WiFi.softAP(ssid,password);
  Serial.print("AP IP: ");Serial.println(WiFi.softAPIP());
  server.on("/",HTTP_GET,handleRoot);
  server.on("/api",HTTP_POST,handleAPI);
  server.begin();
}
void loop(){ server.handleClient(); }

Bezpośrednia odpowiedź na pytanie Szczegółowa analiza problemu

• Tryb AP: WiFi.softAP() tworzy własną sieć (domyślnie 192.168.4.1).
• Serwer HTTP: ESP8266WebServer obsługuje trasy / (HTML) i /api (JSON).
• fetch(): nowoczesny, natywny interfejs JS dla żądań asynchronicznych;
– nagłówek Content-Type: application/json informuje ESP8266, że treść to JSON;
body: JSON.stringify(...) konwertuje obiekt JS do tekstu.
• Odbiór po stronie ESP: server.arg("plain") zawiera cały „payload” POST-a; dla złożonych struktur warto użyć ArduinoJson.
• Zarządzanie pamięcią: HTML trzymamy w PROGMEM (send_P), ponieważ ESP8266 ma ~40 kB RAM.
• CORS: gdy strona hostowana jest gdzie indziej niż ESP, dodajemy nagłówek Access-Control-Allow-Origin.
• Bezpieczeństwo: minimum 8-znakowe hasło WPA2, ewentualnie HTTPS (wymaga BearSSL i większego flasha).

Aktualne informacje i trendy

  • Coraz częściej korzysta się z ​ESPAsyncWebServer (asynchroniczny, wydajniejszy, WebSockety).
  • JSON jest standardem wymiany danych; dla „cięższych” aplikacji migruje się na ESP32 (Wi-Fi + BT, więcej RAM).
  • W projektach produkcyjnych rośnie popularność OTA (Over-The-Air) oraz TLS (np. Let’s Encrypt + BearSSL).

Wspierające wyjaśnienia i detale

  • Domyślny kanał Wi-Fi to 1, można zmienić: WiFi.softAP(ssid,pass,channel).
  • Aby uniknąć blokowania pętli, HTML można gzip-ować (server.send() z Content-Encoding: gzip).
  • Dla wielu klientów (smart-home) warto włączyć mDNS (esp8266.local).

Aspekty etyczne i prawne

  • Punkt dostępowy powinien działać na dozwolonych kanałach (ETSI 1–13).
  • Gromadzenie jakichkolwiek danych osobowych podlega RODO/GDPR; zapewnij szyfrowanie lub anonimizację.
  • Upewnij się, że nie zakłócasz innych sieci (moc nadawania, autoselekcja kanału).

Praktyczne wskazówki

  • Testuj najpierw lokalnie przez http://192.168.4.1/.
  • Ustaw Serial.setRxBufferSize() przy dużych payloadach.
  • Kompresuj stronę (gzip) i posyłaj Content-Type: text/html; charset=utf-8.
  • Aktualizacje firmware’u – włącz OTA (ArduinoOTA.h).

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • ESP8266 obsłuży najwyżej kilku równoczesnych klientów; w sieci publicznej może się „zapchać”.
  • HTTPS znacznie zmniejsza liczbę dostępnych połączeń (RAM na klucze).
  • Brak wielowątkowości – długotrwałe operacje (np. SD, sensor I²C) są blokujące.

Sugestie dalszych badań

  • Migracja na ESP32 (dwurdzeniowy, BLE, większy RAM).
  • Zastosowanie WebSocketów lub MQTT dla komunikacji w czasie rzeczywistym.
  • Użycie SPIFFS/LittleFS do przechowywania wielu plików (HTML/CSS/JS).
  • Weryfikacja integralności danych (HMAC, JWT) przy pracy w sieci otwartej.

Krótkie podsumowanie

Udostępniliśmy kompletny, działający przykład: ESP8266 w trybie AP serwuje stronę, która wysyła JSON metodą fetch() do endpointu /api. Po stronie mikrokontrolera dane są odbierane i opcjonalnie parsowane biblioteką ArduinoJson, a odpowiedź zwracana w formacie JSON. Pokazano też praktyczne uwagi dotyczące pamięci, bezpieczeństwa i rozszerzeń (AsyncWebServer, OTA, TLS). Dzięki temu szkieletowi można łatwo rozbudować aplikację o sterowanie GPIO, logowanie sensorów czy integrację z większym systemem IoT.

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.