ESP8266 GET reqeust in Variable schreiben

Moiner!

Ich habe auf einem ESP8266 einen kleinen Webserver laufen. Funktioniert soweit auch alles, nur dass die Daten von einem html - form mit der methode GET nicht übernommen werden. Ziel war es die Daten die mittels GET reqeust an den server gesendet werden in einer String Variable zu speichern.

Ansatz hierbei war:

void setup () {
....
server.on("/ok.html", HTTP_GET, handleOk);
....
}

HTML Ausschnitt:
....
"<form action="ok.html" method="GET">"
"<input type="number" name="var1val">"
....

handleOk () {
server.send(200, "text/html", ok);
var1val = server.arg("var1val");
....

var1val wurde vorher global als String deklariert.

Habe ich irgendwas vergessen?

Danke im Voraus.

Gib uns bitte den vollständigen Sketch und setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

nikkk:
var1val wurde vorher global als String deklariert.

Da solltest du ansetzen!
Deinen Fehler zu suchen.

nikkk:
Habe ich irgendwas vergessen?

Ja!
Die restlichen fetzen vom Ganzen!

Gruß Fips

wenn du du Daten aus einem form an den Server zurückschicken willst dann sollst du aber eigenlich ein POST verwenden um die Daten zu übertragen.

Das kommt auf die Daten an. So ein paar kleine Felder kann man auch mit GET machen.

Gruß Tommy

Aus dem Codefetzen glaube ich zu lesen, dass er Werte übertragen möchte und nicht eine Resource abfragen will. Daher ist das ein POST und nicht ein GET. Auch wenn es nur "ein paar kleine Felder", kann man es am ESP gleich gleich richtig machen, ist vom Implementierungsaufwand her quasi egal.

Was ist an GET zum Übertragen einiger Parameter nicht "richtig"?

Gruß Tommy

Hab unwichtige Sachen wegkürzen müssen da sonst zu lang.
Genau, ich möchte einfach dass ein Argument aus dem Form in eine Variable geschrieben wird.
Also: 192.169.25.4/ok.html?var1=5&var2=7 .... usw.. Der Wert aus Var1 soll dann z.B. in eine String Variable o.ä. geschrieben werden. POST habe ich auch schon ausprobiert.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>

#ifndef APSSID
#define APSSID "ESP"
#define APPSK  "++++++++++"
#endif

int var1 = 5;
int var2 = 6;
int var3 = 7;
int var4 = 8;
int var5 = 9;
int var6 = 10;
int files = 11;

String var1val = "0";
String var2_val = "0";
String var3_val = "0";
String var4_val = "444";
String var5_val = "0";
String var6_val = "0";
String files_val = "0";

String vardef1 = "Fehler1:";
String vardef2 = "Fehler2:";
String vardef3 = "Fehler3:";
String vardef4 = "Fehler4:";
String vardef5 = "Fehler5";
String vardef6 = "Fehler6";

/* SSID / Passwort festlegen. */
const char *ssid = APSSID;
const char *password = APPSK;

const char *ok = "<!doctype html>"
                                     "<body>"
                                     "<style>"
                                         "h1,p {"
                                           "text-align: center;"
                                           "font-family: Segoe, \"Segoe UI\", \"DejaVu Sans\", \"Trebuchet MS\", Verdana, \"sans-serif\";"
                                           "font-size: 60pt;"
                                        "}"
                                         
                                         "p {"
                                           "font-size: 20pt;"
                                         "}"
                                         
                                         "#p1 {"
                                           "font-size: 12pt;"
                                         "}"
                                         
                                       "</style>"
                                       "<h1>OK</h1>"
                                       "<p>New settings are applied.</p>"
                                       "<p id=\"p1\">We will redirect in a few seconds..</p>"
                                     "</body>"
                                     "</html>";


String settings = String ("<!DOCTYPE html>") +
                                               "<table>" +
                                                 "<form action=\"ok.html\" method=\"GET\">" +  // CHANGE
                                                 "<tr>" +
                                                   "<th>Fehler</th>" +
                                                   "<th>Anzahl neu</th>" +
                                                   "<th>Anzahl alt</th>" +
                                                   "<th>Fehler neu</th>" +
                                                 "</tr>" +
                                                 "<tr>" +
                                                   "<td>Hauptgräte:</td>" +
                                                   "<td><input type=\"number\" name=\"var1val\"></td>" +
                                                   "<td>" + String(var1val) + "</td>" +
                                                   "<td><input type=\"text\" name=\"vardef1\"></td>" +
                                                 "</tr>" +
                                                 "<tr>" +
                                                   "<td>Nackengräte:</td>" +
                                                   "<td><input type=\"number\" name=\"var2_val\"></td>" +
                                                   "<td>" + String(var2_val) + "</td>" +
                                                   "<td><input type=\"text\" name=\"vardef2\"></td>" +
                                                "</tr>" +
                                                 "<tr>" +
                                                   "<td>Schwanz raus:</td>" +
                                                   "<td><input type=\"number\" name=\"var3_val\"></td>" +
                                                   "<td>" + String(var3_val) + "</td>" +
                                                   "<td><input type=\"text\" name=\"vardef3\"></td>" +
                                                 "</tr>" +
                                                 "<tr>" +
                                                   "<td>Maschinenstopp:</td>" +
                                                   "<td><input type=\"number\" name=\"var4_val\"></td>" +
                                                   "<td>" + String(var4_val) + "</td>" +
                                                   "<td><input type=\"text\" name=\"vardef4\"></td>" +
                                                 "</tr>" +
                                                 "<tr>" +
                                                   "<td>Var5</td>" +
                                                   "<td><input type=\"number\" name=\"var5_val\"></td>" +
                                                   "<td>" + String(var5_val) + "</td>" +
                                                   "<td><input type=\"text\" name=\"vardef5\"></td>" +
                                                 "</tr>" +
                                                 "<tr>" +
                                                   "<td>Var6</td>" +
                                                   "<td><input type=\"number\" name=\"var6_val\"></td>" +
                                                   "<td>" + String(var6_val) + "</td>" +
                                                   "<td><input type=\"text\" name=\"vardef6\"></td>" +
                                                 "</tr>" +
                                                 "<tr>" +
                                                   "<td></td>" +
                                                   "<td></td>" +
                                                   "<td></td>" +
                                                   "<td></td>" +
                                                 "</tr>" +
                                                 "<tr>" +
                                                   "<td style=\"font-size: 16pt;font-weight: 200;\">Fehler gesamt:</td>" +
                                                   "<td><input type=\"number\" value=\"var7\" name=\"var7\"></td>" +
                                                   "<td></td>" +
                                                   "<td></td>" +
                                                 "</tr>" +
                                               "</table>" +
                                                 "<div id=\"buttons\"><input class=\"button\" type=\"submit\" id=\"reset\" name=\"set\" value=\"set\"></div>" +
                                                 "</form>" +
                                             "</body>" +
                                             "</html>";

                               
ESP8266WebServer server(80);

/* SETUP: 
*/

void setup() {
 delay(1000);
 Serial.begin(115200);
 Serial.println();
 Serial.print("Configuring access point...");
 WiFi.softAP(ssid, password);

 IPAddress myIP = WiFi.softAPIP();
 Serial.print("AP IP address: ");
 Serial.println(myIP);
 server.on("/", handleRoot);
 server.on("/settings.html", HTTP_GET, handleSettings);
 server.on("/ok.html", HTTP_GET, handleOk);
 server.onNotFound(handleNotFound);
 server.begin();
 Serial.println("HTTP server started");
}

void handleRoot() {
   server.send(200, "text/html", root);
 }

void handleOk() {

server.send(200, "text/html", ok);
 
 var1val = server.arg("var1val");
 Serial.println(server.arg("var1val"));
 var2_val = server.arg("var2_val");
 var3_val = server.arg("var3_val");
 var4_val = server.arg("var4_val");
 var5_val = server.arg("var5_val");
 var6_val = server.arg("var6_val");

 vardef1 = server.arg("vardef1");
 Serial.println(server.arg("vardef1"));
 vardef2 = server.arg("vardef2");
 vardef3 = server.arg("vardef3");
 vardef4 = server.arg("vardef4");
 vardef5 = server.arg("vardef5");
 vardef6 = server.arg("vardef6");


}

void handleSettings () {
 server.send(200, "text/html", settings);           
}

void handleNotFound(){
 server.send(200, "text/html", notFound);
}

void loop() {
 server.handleClient();
}

Na wenn Du den Wert von var1 haben willst, musst Du auch server.arg("var1") abfragen.
Durchnummerierung von Variablen ist übrigens eine sehr schlechte Idee.

Gruß Tommy

Mache ich, html Teil:

"<td><input type=\"number\" name=\"var1val\"></td>" +

Programm Teil:

var1val = server.arg("var1val");

Ich habe es getestet!

Dein Html ist fehlerhaft!!

Bring das in Ordnung, dann kommen auch alle Werte sauber beim Esp.. an.

Gruß Fips

nikkk:
Mache ich, html Teil:

Warum schreibst Du dann in #7 etwas anderes?

nikkk:
Also: 192.169.25.4/ok.html?var1=5&var2=7 .... usw.. Der Wert aus Var1 soll dann z.B. in eine String Variable o.ä. geschrieben werden.

Gruß Tommy

Danke schon einmal.

Habe alles überprüft und den Fehler mit dem form in der Tabelle behoben.
Trotzdem weiß ich nicht wirklich weiter, auch nicht was noch falsch sein soll. Der Link sieht wie folgt aus:

192.168.4.1/ok.html?var1val=42&var2_val=4442&var3_val...

Das müsste doch soweit gehen, oder?
Ich dachte dass wenn der Link soweit erzeugt wird html-seitig alles Ok sein müsste.

Entschuldigt mir meine Unwissenheit.

Tommy56:
Warum schreibst Du dann in #7 etwas anderes?

Gruß Tommy

Entschuldige die Verwirrung, das war nur als Beispiel gedacht.

nikkk:
192.168.4.1/ok.html?var1val=42&var2_val=4442&var3_val...

Das müsste doch soweit gehen, oder?

Ja, obwohl ich POST schöner fände!

Die Werte kommen ja jetzt beim Esp... an.

Edit: Aber?

Gruß Fips

Diese String Zusammensetzungs-Orgie ist auch ganz, ganz schlimm. Und völlig unnötig. Dafür gibt "raw string literals":

Das wird aus dem Beispiel da nicht ganz deutlich, aber du kannst du den Text auf mehrere Zeilen verteilen und es wird genauso behandelt wie es geschrieben ist

  • brauchst du erst wenn du eine Variable dazwischen einfügen willst

Serenifly:
Das wird aus dem Beispiel da nicht ganz deutlich, aber du kannst du den Text auf mehrere Zeilen verteilen und es wird genauso behandelt wie es geschrieben ist

  • brauchst du erst wenn du eine Variable dazwischen einfügen willst

Beispiel dazu:

 String temp = R"(<!DOCTYPE HTML>
   <html lang="de">
   <head>
      <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
      <meta name="viewport" content="width=device-width, initial-scale=1">)";
  temp += var1val;

Gruß Fips

Wobei da auch die Leerzeichen wirklich im String sind. Da muss man etwas aufpassen. Andererseits muss man Anführungszeichen nicht ausmaskieren. Ohne das würde es so aussehen:

String temp str =
"<!DOCTYPE HTML>"
   "<html lang=\"de\""
   "<head>"
	"<meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">"
	"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">";

Dann habe ich mich glaube ich komplett unverständlich ausgedrückt.

Also noch mal Schritt für Schritt:

Der Link mit dem GET request wurde von Anfang an erzeugt. Mein Problem ist nur dass die Werte nicht in die Variablen geschrieben werden. Auch wenn ich mir die Ausgabe von arg() ausgeben lasse, gibt diese Funktion keinen Wert heraus.

POST hat auch zu keinem Ergebnis geführt.

Ich mache, offensichtlich, irgendeinen Fehler, den ich nicht finde.

Die Werte werden ganz sicher in die Variable geschrieben. Die kannst du doch mit Serial.print ausgeben lassen.

Gruß Fips