Hallo Gemeinde, ich betreibe ein Projekt mit zwei ESP8266. Der Client sendet einen HTML-Befehl an den Server. Der Server führt die Anweisung aus und meldet über client.print() den Erfolg. Diese Erfolgsmeldung kommt beim Client auch an und wird über serial.print() über HTML ausgegeben.
Diese HTML-Ausgabe möchte ich in einer Variable speichern und einen bestimmten Teil daraus extrahieren um damit weiter zu arbeite. Wie kann ich die HTML-Antwort vom Server in einer String-Variable speichern? Ist bestimmt ganz einfach, aber ich stehe bei HTML etwas auf dem Schlauch.
Gruß HM_DD
Wie wäre es, wenn du den Code einmal zeigen würdest?
Bitte posten Sie in englischer Sprache im englischen Bereich des Forums. Ihr Thema wurde in den deutschen Bereich verschoben.
Ursprünglicher Standort: WebEditor
Ja gern. Hier der Part vom Client:
```cpp
void WiFiSenden(char* Send1){
// Beginn WiFi
WiFiClient client;
HTTPClient http;
Serial.print("[HTTP] begin...\n");
//if (http.begin(client, "http://192.168.178.61/gpio/1")) { // HTTP
if (http.begin(client, Send1)) { // HTTP
Serial.print("[HTTP] GET...\n");
// start connection and send HTTP header
int httpCode = http.GET();
// httpCode will be negative on error
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
// file found at server
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = http.getString();
Serial.println(payload);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
Und hier der Antwortteil vom Server:
```cpp
client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now "));
client.print((val) ? F("high") : F("low"));
Die Ausgabe auf den Server sieht dann so aus (2 Anweisungen übertragen):
Button 1-AUF
[HTTP] begin...
[HTTP] GET...
[HTTP] GET... code: 200
GPIO is now low
Button 1-Zu
[HTTP] begin...
[HTTP] GET...
[HTTP] GET... code: 200
GPIO is now high
Wenn Du nur 1 Wert aus der Antwort brauchst, warum antwortest Du dann als HTML und schickst nicht den einen Wert als text/plain.
Schau Dir auch mal das beim ESP8266 mit gelieferte Beispiel des Webservers an. Das geht einfacher, als die alte client.print-Methode.
Gruß Tommy
Mein Server ist genau das leicht angepasste Beispiel aus den ESP8266 Beispielen (WiFiManualWebServer.ino). Hat auf anhieb funktioniert und benutzt die client.print() Methode.
Wie müsste die Server-Antwort aussehen, wenn ich mittels taxt/plain die Variable val übermitteln will?
Gruß DD_HM
Dann schau mal anstelle von ESP8266WiFi in ESP8266WebServer.
Aber text/plain geht auch mit dem anderen.
Gruß Tommy
Wenn Du uns noch den geheimen Typ von val verrätst, könnte man das sagen.
Gruß Tommy
Hier der Teil wo val erstellt wird:
Serial.println(req);
// Match the request
int val;
//int val = 2; // Ausgangszustand
if (req.indexOf(F("/gpio/0")) != -1) { // Auf
val = 0;
} else if (req.indexOf(F("/gpio/1")) != -1) { // Zu
val = 1;
} else {
Serial.println(F("invalid request"));
//val = digitalRead(LED_BUILTIN);
val = 2;
}
// Set LED according to the request
//digitalWrite(LED_BUILTIN, val);
// Set GPIO's according to the request
if (val == 0) {
digitalWrite(0, 1); // GPIO0 ON
delay(1000); // wait 1 Sek.
digitalWrite(0, 0); // GPIO0 OFF
//val = 2; // Reset val
}
else if (val == 1) {
digitalWrite(2, 1); // GPIO2 ON
delay(1000); // Wait 1 Sek.
digitalWrite(2, 0); // GPIO2 OFF
//val = 2; // Reset val
}
Gruß DD_HM
Also ein int. Das könnte bei der umständlichen Variante so gehen:
client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n"));
client.print(val);
Gruß Tommy
Super Tommy, das funktioniert prima. Jetzt wird nur noch 0 oder 1 als Antwort angezeigt, genau was ich wollte. Aber wie bekomme ich die Antwort auf der Client-Seite jetzt in eine Variable?
Bisher wird ja mittels :
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
die Ausgabe erledigt. Zusätzlich soll die Antwort auch zur weiteren Verwendung in einer Variable "antw" gespeichert werden.
Du hast doch die Zeile
String payload = http.getString();
Da mache doch draus:
int antw = http.getString().toInt();
Gruß Tommy
AHH, klar hatte ich auch gerade gesehen, hier wird die Antwort ja bereits in die Variable "payload" gespeichert.
// file found at server
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = http.getString();
Serial.println(payload);
Klasse Tommy, du bist der Größte. Ich programmiere schon viele Jahre mit Arduino. Aber die ESP Geschichte mit WIFI ist Neuland. Die ganze HTML Sache ist noch sehr verwirrend für mich. Aber jetzt komme ich richtig weiter, dank deiner Hilfe.
Gruß HM_DD
Dann schau dir wie bereits empfohlen das Beispiel
ESP8266WebServer
an und baue deinen Webserver entsprechend auf.
Ja, werde ich mir auf jeden Fall genauer ansehen. Man lernt ja nie aus und kann nur besser werden, Danke.
Gruß HM_DD
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.