esp8266, jak client ma wysłać POST dane do serwera
ESP8266WiFi.h
+ ESP8266HTTPClient.h
, połącz się z Wi-Fi i wykonaj http.POST(payload)
wskazując poprawny URL, nagłówek Content-Type
oraz długość danych. WL_CONNECTED
, 2) HTTPClient::begin()
z adresem serwera, 3) addHeader()
z typem danych, 4) POST()
z treścią, 5) obsłuż kod odpowiedzi.#include <ESP8266WiFi.h>
const char* ssid = "SSID"; // nazwa sieci
const char* pass = "PASS"; // hasło
void connectWiFi() {
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) { delay(500); }
}
Wysoko-poziomowy HTTPClient
(zalecany)
#include <ESP8266HTTPClient.h>
void postJSON() {
WiFiClient client; // HTTP
HTTPClient http;
http.begin(client, "http://example.com/api/data");
http.addHeader("Content-Type", "application/json");
String json = "{\"t\":25.4,\"h\":58,\"id\":\"ESP001\"}";
int code = http.POST(json); // wysyłka
if (code>0) Serial.println(http.getString());
http.end();
}
HTTPS z weryfikacją CA (od rdzenia 3.1.2 preferowana metoda)
#include <WiFiClientSecure.h>
const char *root_ca PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIF...
-----END CERTIFICATE-----
)EOF";
void postHTTPS() {
WiFiClientSecure sclient;
sclient.setTrustAnchors(new X509List(root_ca)); // pełna weryfikacja
HTTPClient https;
https.begin(sclient, "https://secure.example.com/endpoint");
https.addHeader("Content-Type","application/json");
https.POST("{\"value\":123}");
https.end();
}
Surowy WiFiClient
(pełna kontrola, minimalny narzut)
WiFiClient c;
if (c.connect("example.com", 80)) {
String body = "a=1&b=2";
c.print(String("POST /post HTTP/1.1\r\n") +
"Host: example.com\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n" +
"Content-Length: " + body.length() + "\r\n\r\n" +
body);
while (c.connected() || c.available()) { if (c.available()) Serial.write(c.read()); }
c.stop();
}
Format należy dopasować do wymagań serwera:
application/x-www-form-urlencoded
– proste pary key=value
. application/json
– zalecany w REST; wygodnie tworzyć przy pomocy ArduinoJson
. octet-stream
– przy wysyłce plików (OTA, zdjęcia). HTTPClient
(np. -11
timeout). delay(1000*(attempt+1))
.String
: payload.reserve(256);
. http.end()
lub client.stop()
– wycieki TLS i heapu. http.setTimeout(ms)
(domyślnie 5 s). WiFi.setSleepMode(WIFI_LIGHT_SLEEP)
między wysyłkami dla oszczędności energii. Obszar | 2024 | Co dalej? |
---|---|---|
Rdzeń Arduino-ESP8266 | 3.1.2 (stabilny) – domyślne TLS 1.2 / BearSSL, obsługa RSA-3072 i ECDSA-SECP256R1 | Planowane TLS 1.3, lepsze wsparcie dla ESP8266EX w niskim zasilaniu |
Biblioteki HTTP | ESP8266HTTPClient i asynchroniczny ESPAsyncHTTPClient (WebSockets/HTTP2 draft) |
Konwergencja z bibliotekami ESP32, wspólny namespace HTTPClient |
Protokół alternatywny | MQTT 3.1.1/5.0 przewyższa HTTP w IoT (niższy narzut, QoS) | CoAP + DTLS oraz Matter/CHIP dla Smart-Home |
Certyfikaty | Root ISRG X1 (Let’s Encrypt) ważny do 2035 – wbuduj CA zamiast fingerprint | Automatyczne odnawianie CA przez OTA |
Content-Length
jest wymagane w HTTP/1.1, o ile nie zastosujesz „chunked encoding”. http.end()
. WiFiClientSecure
a BearSSL::WiFiClientSecure
– w rdzeniu 3.x występuje tylko druga klasa; stara nazwa mapowana jest aliasem. Przykład serwera Flask (Python) akceptującego JSON:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/data', methods=['POST'])
def data():
payload = request.get_json()
print(payload)
return jsonify(ok=True), 200
app.run(host='0.0.0.0', port=5000)
curl
lub Postman
zanim podłączysz ESP8266. Access-Control-Allow-Origin
. ESP.wdtEnable(8000)
) – długie żądania mogą zawiesić MCU. client.setInsecure()
jest wygodne w testach, ale niewskazane w produkcji. ESPAsyncWebServer
/ ESPAsyncTCP
dla równoległych transferów. ESP8266 może wysyłać dane metodą POST na dwa sposoby: szybki HTTPClient
lub manualny WiFiClient
. W obu przypadkach:
Content-Type
, 3) umieść dane w ciele żądania, 4) sprawdź kod odpowiedzi, 5) zwolnij zasoby.