@cooper Ahhhhhhhhh nein waren sie nicht :schmartie:
Danke vielmals.
ESP8266 GET-Variablen auslesen
-
GET-Variablen sind Variablen, die über die URL übergeben werden. Das kann einerseits manuell durch eintippen der URL im Browser geschehen, oder durch andere Programme oder Geräte. Grundlegend lässt sich sagen, dass GET-Variablen im Webbrowser immer an einem
?
erkennbar sind. Anschließend folgen die Variablen mit ihren Inhalten.Wenn man die URL http://example.com?variable=wert aufruft, wird die Variable
variable
mit dem Inhaltwert
übergeben. Man kann auch mehrere Variablen übergeben, diese werden dann mit einem&
voneinander getrennt.http://example.com/?name=cooper&alias=brain
Variable:name = cooper
Variable:alias = brain
GET-Variablen kann man immer und überall übergeben - macht meistens aber keinen Sinn. Erst wenn der Server dementsprechend programmiert ist, werden die übergebenen Daten verarbeitet. Und genau das macht dieser Code.
Beispiel
Auf dem ESP8266 läuft ein Webserver. Die IP-Adresse meines ESPs lautet
192.168.178.47
.Beim Aufruf der URL des ESPs wird die Variable
name
übergeben. Der Inhalt der Variable wird vom ESP ausgelesen und kann dann verarbeitet werden. Im Beispiel ist die Verarbeitung die einfache Ausgabe im Webbrowser und im seriellen Monitor.http://192.168.178.47/?name=cooper
Output:Name: cooper
http://192.168.178.47/?name=makesmart
Output:Name: makesmart
http://192.168.178.47/?name=gehtdichgarnixan
Output:Name: gehtdichgarnixan
Code
/* HTTP-GET Request verarbeiten Basic-Code für GET-Request Verarbeitung auf dem ESP8266 Created by cooper, 2020 makesmart.net */ #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> ESP8266WebServer server(80); const char* ssid = "WLAN_SSID"; const char* password = "WLAN_PASS"; void setup() { Serial.begin(115200); Serial.println("ESP Gestartet"); WiFi.begin(ssid, password); Serial.print("Verbindung wird hergestellt ..."); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.print("Verbunden! IP-Adresse: "); Serial.println(WiFi.localIP()); server.onNotFound([](){ // Es wird keine Seite definiert, sodass bei jeder URL IMMER die Funktion // get_hook() aufgerufen wird get_hook(); }); server.begin(); Serial.println("Webserver gestartet."); } void loop() { server.handleClient(); } void get_hook() { if(server.hasArg("name")){ // Variable "name" wird übergeben Serial.println("Variable 'name' übergeben!"); // Anschließend die Prüfung, ob die Variable 'name' leer ist: if(server.arg("name") != ""){ // Falls Variable 'name' nicht leer ist: Serial.println(server.arg("name")); // Ausgabe im Webbrowser HTTP-Code 200: Ok server.send(200, "text/plain", "Name: " + server.arg("name")); }else{ // Wenn Variable die 'name' übergeben wurde, aber leer ist: // Ausgabe im Webbrowser HTTP-Code 200: Ok server.send(200, "text/plain","Name ist da! .. Aber ohne Inhalt."); } }else{ //Wenn gar keine Variablen übergeben wurden server.send(200, "text/plain", "Es wurden keine Variablen übergeben"); } }
Einstellungen
Das übliche. Wie immer die WLAN-Daten:
const char* ssid = "SSID"; const char* password = "PSK";
Es wurde keine spezielle Seite definiert. Es wird immer die Funktion get_hook() aufgerufen:
server.onNotFound([](){ get_hook(); });
Natürlich kann der Webserver auch nur bei bestimmten Links die Funktion aufrufen:
server.on("/set_data", []() { get_hook(); });
http://192.168.178.47/set_data?name=cooper
Output:Name: cooper
Anwendung
GET-Variablen könnten z.B Variablen auf dem ESP überschreiben, um Parameter im laufenden Betrieb zu ändern. Mit dem Link
http://192.168.178.47/?delay=5000
könnte zum Beispiel der
delay()
des Blink-Programmes geändert werden.
In einem Projekt von mir habe ich GET-Variablen verwendet, um Zeiten und Abläufe in einem Programm im laufenden Betrieb zu ändern.
GET-Variablen können auch dazu dienen, Funktionen aufzurufen um I/O-Pins zu schalten oder andere Prozesse & Abläufe einzuleiten.
http://192.168.178.47/?timer=50
http://192.168.178.47/?delay=300
http://192.168.178.47/?sensor=active
Mit so ziemlich jeder Programmiersprache kann man HTTP-GET Requests senden. Unter anderem auch mit einem ESP.
Diese Methode ist eine sehr einfache Möglichkeit, den ESP mit anderer Software & auch Hardware zu verbinden um mit variablen Werten zu arbeiten.
#ESP8266 #HTTP #Request #D1-Mini #Arduino-IDE
Viel Spaß mit euren Projekten,
cooper
-
Hallo! Habe das Programm 1 zu 1 übernommen bekomme aber die Meldung “Webseite funktioniert nicht”. IP-Adresse, SSID und Passwort angepasst. Im Programmteil “get_hook” um eine Ausgabe erweitert. “get_hook” wird nicht angesprungen, sollte doch durch "server.onNotFound… aufgerufen werden. Kann das durch unterschiedliche Librarys-Versionen passieren. -Ratlos
-
@hermann sagte in ESP8266 GET-Variablen auslesen:
Kann das durch unterschiedliche Librarys-Versionen passieren.
Ausschließen kann man das natürlich nie. Aber ich vermute die Funktionen werden die selben sein.
Zeigt der serielle Monitor irgendwas besonderes an? Startet der Webserver?
Es ist normal, dass im Browser steht
Webseite funktioniert nicht
, da der Server keine Response sendet.Du kannst mal unter
server.onNotFound()
folgendes einfügen:server.onNotFound([](){ // Es wird keine Seite definiert, sodass bei jeder URL IMMER die Funktion // get_hook() aufgerufen wird server.send(200, "text/plain", "Diese Seite wurde nicht gefunden!"); get_hook(); });
Webseite funktioniert nicht
sollte dann verschwinden, und der angegebene Text sollte erscheinen. Zumindest wenn der Webserver gestartet wird. So kann man den Fehler schon mal eingrenzen. -
Hallo Cooper!
Danke für die schnelle Antwort!
Nach dem Programmstart:
connected with beauty, channel 5
dhcp client start…
…ip:192.168.8.179,mask:255.255.255.0,gw:192.168.8.1
.
connected with beauty, channel 5
dhcp client start…
…ip:192.168.8.179,mask:255.255.255.0,gw:192.168.8.1
.
Verbunden! IP-Adresse: 192.168.8.179
Webserver gestartet.
pm open,type:2 0WeB-Seite gibt jetzt den Text: Diese Seite wurde nicht gefunden! aus. Nur get_hook() wird nicht aufgerufen. Dort habe ich einen Text am Anfang eingefügt: Serial.println(“get_hook wird aufgerufen.”);
??? -
@hermann sende mal deinen Code…
Aber verwende bitte code Tags
-
/* HTTP-GET Request verarbeiten Basic-Code für GET-Request Verarbeitung auf dem ESP8266 Created by cooper, 2020 makesmart.net */ #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> ESP8266WebServer server(80); const char* ssid = "beauty"; const char* password = "0x33=*3*"; //char* name = "Hubert "; void setup(){ Serial.begin(115200); Serial.println("ESP Gestartet"); WiFi.begin(ssid, password); Serial.print("Verbindung wird hergestellt ..."); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.print("Verbunden! IP-Adresse: "); Serial.println(WiFi.localIP()); // server.send(200, "text/plain", "Diese Seite wurde nicht gefunden!"); // server.onNotFound([](){void get_hook();}); server.onNotFound([](){ server.send(200, "text/plain", "Diese Seite wurde nicht gefunden!"); get_hook(); Serial.println("und dies nach get_hook"); }); server.begin(); Serial.println("Webserver gestartet."); } void loop() { server.handleClient(); } void get_hook() { Serial.println("get_hook wird aufgerufen."); if(server.hasArg("name")){ // Variable "name" wird übergeben Serial.println("Variable 'name' übergeben!"); // Anschließend die Prüfung, ob die Variable 'name' leer ist: if(server.arg("name") != ""){ // Falls Variable 'name' nicht leer ist: Serial.println(server.arg("name")); // Ausgabe im Webbrowser HTTP-Code 200: Ok server.send(200, "text/plain", "Name: " + server.arg("name")); }else{ // Wenn Variable die 'name' übergeben wurde, aber leer ist: // Ausgabe im Webbrowser HTTP-Code 200: Ok server.send(200, "text/plain","Name ist da! .. Aber ohne Inhalt."); } }else{ //Wenn gar keine Variablen übergeben wurden server.send(200, "text/plain", "Es wurden keine Variablen übergeben"); } }
Das Programm kommt schon weiter - get_hook wird aufgerufen. Es folgt keine weitere Ausgabe auf der WEB-Seite.
Danke -
Mir nicht ganz klar, aber auf der Seriellen bekomme ich die Werte, nur zurücksenden zur WEB_Seite tut es nicht. Finde ich noch. Vielen Dank!
Hermann -
@hermann sagte in ESP8266 GET-Variablen auslesen:
Mir nicht ganz klar, aber auf der Seriellen bekomme ich die Werte, nur zurücksenden zur WEB_Seite tut es nicht
Ja das ist normal. Also die Verarbeitung findet in diesem Tutorial nur auf dem seriellen Monitor statt.
Möchtest du auch auf der Webseite deinen Namen ausgeben lassen, müsstest du das dementsprechend programmieren.
// Ausgabe im Webbrowser HTTP-Code 200: Ok server.send(200, "text/plain", "Name: " + server.arg("name"));
^ dieser Code wird nicht mehr ausgeführt, da der Server vorher bereits geantwortet hat:
server.onNotFound([](){ server.send(200, "text/plain", "Diese Seite wurde nicht gefunden!"); get_hook(); Serial.println("und dies nach get_hook"); });
Was du allerdings machen könntest wäre die Response des Servers erst in der Funktion
get_hook()
zu senden. Also müsstest du lediglich die Response aus der Funktionserver.onNotFound()
löschen.server.onNotFound([](){ get_hook(); Serial.println("und dies nach get_hook"); });
So wird erst mit der Funktion
get_hook()
die Response gesendet. Was du ja scheinbar vor hast.
Ich calle die URL:
http://192.168.178.47/?name=Hubert
Der serielle Monitor liefert mir das hier:
get_hook wird aufgerufen. Variable 'name' übergeben! Hubert und dies nach get_hook
Viel Erfolg
-
Danke!