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:

Links

  • Download des finalen Sketch ESP8266 Webserver WebClient
  • Amazon (Suchlink für NodeMCU V2 mit CP2102 *)
  • Amazon (Alternativ: Wemos D1 pro Mini *)

Die mit Sternchen (*) gekennzeichneten Verweise sind sogenannte Affiliate/Provision-Links. Wenn du auf so einen Verweis klickst und über diesen Link einkaufst, bekomme ich von deinem Einkauf eine (kleine) Provision. Für dich verändert sich der Preis dadurch nicht. Ich empfehle nur Produkte die ich selber besitze und wenn ich überzeugt bin, dass sie für andere Maker interesssant sind.

 

Protokoll

erstellt: 2018-09-02 | Stand: 2021-02-10