Webclient - Senden mittels POST
Angenommen wir möchten erreichen, dass die Wetterstation Daten an einen zentralen Server sendet. Dann müssen wir den ESP als Webclient arbeiten lassen.
Für das senden der Daten halten wir uns an das Beispiel:
ESP8266HTTPClient | BasicHttpclient
Im konkreten Anwendungsfall möchten wir jedoch nicht eine Seite "abfragen" = GET sondern wir möchten Daten "übertragen" = POST. Der wesentliche Unterschied ist, dass Parameter bei GET an den URI nach einem ? angehängt und mit & verkettet werden, hingegen die Parameter bei einem POST im Message-Body enthalten sind. Ansonsten gleicht sich der Aufbau der Parameterübertragung und folgendes steht beíspielhaft im Message Body:
ParameterName=Wert&weitererParameter=Wert
Wie schon beim Webserver, lege ich auch alle Teile des Webclients in einen eigenen Tab. Für den Webclient heißt der Tab "client". Aktuell besteht der webclient nur aus einer einzigen Funktion zum senden von Daten: sendPost()
void sendPost() { WiFiClient wificlient; HTTPClient client; const uint16_t MESSAGE_SIZE_MAX = 300; // maximum bytes for Message Buffer char message[MESSAGE_SIZE_MAX]; // the temporary sending message - html body char val[32]; // buffer to convert floats and integers before appending strcpy(message, "board="); // Append chars strcat(message, TXT_BOARDID); strcat(message, "&vcc="); // Append integers itoa(ESP.getVcc(), val, 10); strcat(message, val); strcat(message, "&output1="); itoa(digitalRead(OUTPUT1_PIN), val, 10); strcat(message, val); strcat(message, "&output2="); itoa(digitalRead(OUTPUT2_PIN), val, 10); strcat(message, val); strcat(message, "&button1="); itoa(digitalRead(BUTTON1_PIN), val, 10); strcat(message, val); client.begin(wificlient, sendHttpTo); // Specify request destination client.addHeader("Content-Type", "application/x-www-form-urlencoded"); // Specify content-type header int httpCode = client.POST(message); // Send the request client.writeToStream(&Serial); // Debug only: Output of received data Serial.print(F("\nhttpCode: ")); Serial.println(httpCode); // Print HTTP return code client.end(); //Close connection }
Im obigen Beispiel werden 4 Werte übertragen: board, vcc, output1 und button1.
Die Resource an die die Daten übergeben werden, muss im Deklarationsteil definiert sein. Das kann ein "echter Webserver" oder auch ein anderer ESP8266-Webserver sein.
const char* sendHttpTo = "http://my.server.tld/d.php"; // the module will send information to that server/resource
Auf einem Webserver mit PHP können diese Daten empfangen werden, und die Parameter beispielsweise mit
if(isset($_POST['vcc'])) {$vcc = $_POST['vcc'];} // php Code - nicht Arduino C++!!!
ausgelesen werden, wobei hier natürlich sämtliche Absicherungen bezüglich Code Injection zu beachten sind.
Den Empfang dieser Daten auf einem ESP8266 sehen wir uns im nächsten Kapitel
an: