ESP8266 Arduino – wysyłanie GET danych do serwera HTTP
ESP8266WiFi.h
oraz ESP8266HTTPClient.h
. http://serwer/api?temp=23.4&hum=60
) i wykonaj http.GET()
. http.end()
.Kluczowe punkty
• Biblioteki: ESP8266WiFi
, ESP8266HTTPClient
(lub surowy WiFiClient
).
• Połączenie Wi-Fi i kontrola WiFi.status()
.
• Konstruowanie poprawnie zakodowanego URL (URL-encoding!).
• Obsługa kodów odpowiedzi, timeoutów i ponownych prób.
• Dla HTTPS – WiFiClientSecure
, certyfikat CA lub setInsecure()
(tylko testy).
Sprzęt, środowisko, biblioteki
• Dowolny moduł ESP8266 (NodeMCU, Wemos D1 mini, ESP-01).
• Arduino IDE ≥ 2.2.1 oraz „esp8266 by ESP8266 Community” core ≥ 3.1.2 (najnowsza stabilna).
• Biblioteki:
‑ ESP8266WiFi.h
– obsługa sieci Wi-Fi.
‑ ESP8266HTTPClient.h
– uproszczone wysyłanie HTTP/HTTPS.
‑ (Opcj.) WiFiClientSecure.h
dla TLS 1.2.
Inicjalizacja połączenia Wi-Fi
#include <ESP8266WiFi.h>
const char* ssid = "SSID";
const char* pass = "PASS";
void connectWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
unsigned long t0 = millis();
while (WiFi.status() != WL_CONNECTED) {
if (millis() - t0 > 15000) { Serial.println("Wi-Fi TIMEOUT"); ESP.restart(); }
delay(250);
}
Serial.printf("IP: %s\n", WiFi.localIP().toString().c_str());
}
Wysyłanie żądania GET – wariant podstawowy
#include <ESP8266HTTPClient.h>
void sendGET(float t, float h) {
if (WiFi.status() != WL_CONNECTED) return;
HTTPClient http;
String url = "http://myserver.com/api/data";
url += "?temp=" + String(t,1) + "&hum=" + String(h,0);
http.begin(url); // lub http.begin(client, url)
http.setTimeout(5000); // 5 s
int code = http.GET();
if (code > 0) {
Serial.printf("HTTP %d\n", code);
Serial.println(http.getString());
} else {
Serial.printf("HTTP error: %s\n", http.errorToString(code).c_str());
}
http.end();
}
Wysyłanie żądania GET – wariant z surowym WiFiClient
(mniejszy narzut RAM)
WiFiClient client;
if (client.connect("myserver.com", 80)) {
String req = "GET /api/data?temp=24.1 HTTP/1.1\r\n"
"Host: myserver.com\r\n"
"Connection: close\r\n\r\n";
client.print(req);
while (client.connected() && !client.available()) delay(10);
while (client.available()) Serial.write(client.read());
client.stop();
}
HTTPS / TLS 1.2
#include <WiFiClientSecure.h>
void sendHTTPS() {
WiFiClientSecure sclient;
sclient.setInsecure(); // tylko do debugowania!
HTTPClient https;
https.begin(sclient, "https://mysecure.com/api?key=xyz");
int code = https.GET();
https.end();
}
W produkcji pobierz i załaduj certyfikat CA (512–1024 B flash).
Obsługa błędów i reconnection
• Sprawdzaj WiFi.status()
w loop()
, ewentualnie wywołuj WiFi.reconnect()
.
• Dla kodów 3xx obsłuż przekierowania (http.followRedirects()
od core 2.6).
• Przy kodach 4xx/5xx loguj szczegóły – ułatwia diagnostykę backendu.
Po stronie serwera – odbiór parametrów
• PHP: $_GET['temp']
, $_GET['hum']
.
• Node.js/Express: req.query.temp
.
• Zalecane logowanie czasu i adresu IP.
Ograniczenia i teoria
• GET jest limitowany do ~2 kB na ESP (RFC 2616 nie wymusza, ale większość serwerów ogranicza URL do 2048 B).
• Dane jawnie w adresie URL → brak poufności, łatwość cache’owania.
• Przy większej/poufnej paczce użyj POST lub MQTT.
• Rdzeń ESP8266 3.x wspiera „async” HTTPClient
i lepszą obsługę protokołu HTTP/1.1-keep-alive (mniejsze zużycie prądu).
• Coraz częściej stosuje się ESPAsyncTCP
/ ESPAsyncWebServer
dla równoległych zapytań, jednak dla prostego wysyłania danych klasyczny HTTPClient
pozostaje najlżejszy.
• Z uwagi na wycofywanie starszych CA (Let’s Encrypt DST Root CA X3) od 2021, zaleca się cykliczną aktualizację certyfikatów w flashu.
• Migracja projektów IoT do HTTPS i/lub MQTT over TLS staje się rynkowym standardem (wymogi GDPR, ISO 27001).
• URI encoding: spacje → %20
, znaki spoza ASCII koduj funkcją urlEncode()
lub ArduinoHttpClient::escape()
.
• Buffer RAM: HTTPClient
domyślnie tworzy ~3 kB buforu – przy 80 kB RAM w ESP-12E warto po zakończeniu wywoływać http.end()
.
• Keep-alive: http.setReuse(true)
umożliwia ponowne wykorzystanie gniazda – oszczędność ~30 ms/żądanie.
• Zaimplementuj watchdog (ESP.wdtFeed()
lub funkcja sprzętowa) – zawieszenie stosu TCP potrafi zresetować moduł.
• Przy transmisji cyklicznej ustaw Nagle off
→ client.setNoDelay(true)
.
• Użyj WiFi.setAutoConnect(true)
+ WiFi.setAutoReconnect(true)
dla lepszej odporności.
• W sieciach firmowych z proxy – łącz się po portach 8080 lub 443, jeśli 80 jest blokowany.
• ESP8266 nie obsługuje Wi-Fi 5 GHz – problemy z „nowymi routerami” to najczęściej wybór niewłaściwego pasma.
• Długi łańcuch certyfikatów (> ~4 kB) może nie zmieścić się w RAM – skróć go do CA + server-cert.
• GET przez Captive Portal (np. hotel) zakończy się 302 na stronę logowania – obsłuż to w kodzie lub wymuś tryb AP+STA.
• Migracja na ESP32-C3 (Wi-Fi + BLE, rdzeń RISC-V) z biblioteką HTTPClient
– podobny kod, więcej RAM.
• Protokół MQTT v5 z TLS 1.3 jako bardziej efektywna alternatywa dla HTTP pollingu.
• Tryb light-sleep
i „modem-sleep” a cykliczne zapytania GET – pomiar poboru prądu.
• Narzędzia CI/CD: PlatformIO + OTA Update przy zmianach firmware.
Wysłanie danych metodą GET z ESP8266 sprowadza się do:
http.GET()
(lub surowego client.print()
), odczytu kodu statusu, payloadu i zamknięcia sesji. Dla produkcji zaleca się: HTTPS, obsługę timeoutów, ponowne łączenie z Wi-Fi, watchdog, rotację certyfikatów oraz rozważenie alternatywnych protokołów (MQTT). Dzięki temu Twoje urządzenie IoT stanie się bardziej niezawodne, bezpieczne i łatwe do utrzymania.