• ESP8266

    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 Inhalt wert ü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

  • ESP8266

    @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 0

    WeB-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.”);
    ???

  • ESP8266

    @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

  • ESP8266

    @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 Funktion server.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
    

    Bildschirmfoto 2021-01-08 um 19.16.42.png

    Viel Erfolg 🙂


  • Danke!

Ähnliche Themen