Mittels ESP8266 an einen Webserver senden (2/4)

In diesem Teil dieser Serie siehst du, wie man mit einem ESP8266 Daten an einen Webserver sendet.

Allgemeines

Ausgangsbasis für die Übertragung von Daten von einem ESP zu einem Webserver ist das IDE Beispiel PostHTTPClient.ino

Eingangs noch der Hinweis: Wir behandeln hier Module auf Basis des ESP8266. Ich rate jedem Anfänger von der Verwendung von "nackten" ESP8266 ab. Besorg dir bastlerfreundliche Variante wie z.B. den NodeMCU oder den Wemos D1. Neben der Onboard USB Schnitstelle, kommen die auch mit mehr Pins - ohne dass sie wesentlich teurer sind.

Exkurs: Unterschied GET vs POST

Technisch kann man Daten als Parameter an den URI anhängen, und wenn man das auch in vielen Tutorials liest - finde ich das nicht empfehlenswert. Hier wirst du lesen, wie du Daten an einen Webserver mittels der Methode POST und somit im Message Body überträgst

Bei GET werden Parameter nach einem ? direkt nach dem aufzurufenden URI angehängt (und das sieht auch der Anwender in seinem Browser-Adressfeld)

Der http-header request beginnt beispielsweise mit

GET /form.php?variable=1&nochein=Text HTTP/1.1
HOST: 172.18.67.93
Content-Length: 42

<!doctype html>
<html>
...

Bei POST werden die übermittelten Daten im HTTP-body übertragen. Der HTTP-header ist vom HTTP-body durch eine Leerzeile getrennt.

POST /form.php HTTP/1.1
HOST: 172.18.67.93
Content-Type: application/x-www-form-urlencoded
Content-Length: 24

variable=1&nochein=Text

Der Aufbau der Werte/Key Paare ist gleich wie bei GET

Variable = Wert

Als Trenner zwischen den Variablen wird in beiden Fällen ein & verwendet.

HTTP POST mit dem ESP8266

Mit dem ESP8266HTTPClient gelingt ein POST Request ganz einfach. Zunächst braucht es in deinem Sketch ein

#include <ESP8266HTTPClient.h>

Vor dem Senden setzt du den media type auf application/x-www-form-urlencoded

http.addHeader("Content-Type", "application/x-www-form-urlencoded");

Weiter brauchst du dich am ESP8266 um den exakten Aufbau der HTTP header fields nicht mehr kümmern. Du sammelst einfach alle Daten die du an den Webserver übertragen möchtest in einem Buffer zusammen. Im Beispiel Sketch (downloadbar am Ende der Seite) geschieht dies für einen NodeMCU in diesem Abschnitt:

message = "board=";
message += USE_BOARD;
message += "&uptime=";
message += millis()/1000;
message += "&adc=";
message += analogRead(adc);
message += "&pin1=";
message += digitalRead(pin1);
message += "&pin2=";
message += digitalRead(pin2);

Und schließlich verwendest du zum Senden die Methode .POST()

int httpCode = http.POST(message);

Der ESP8266 baut damit die HTTP Nachricht richtig auf.

Durch die Aufbereitung der Daten als POST Parameter, ist es dann in der Folge sehr leicht, diese Werte z.B. mit einem PHP Script am Webserver auszuwerten.

Zusammenfassung

Zum Senden von Daten ist die POST Methode vorzuziehen. Am ESP8266 verwendest du dazu am besten den ESP8266HTTPClient.

Links

Protokoll

First upload: 2020-09-26 | Version: 2021-12-05