- LiFePO4 Speicher Test         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 36

Thema: html code für User Login + password (esp8266 + Arduino IDE)

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Anzeige

    Praxistest und DIY Projekte
    Wenn man vor dem if(....) ein Serial.println(strupwd); macht, sieht man, was dort vor dem if ankommt. Man muss mal die beteiligten Variablen (Strings) ausgeben, dann sieht man mehr. Dann kann man auch gleich die Länge mit ausgeben (Serial.println(strlen(strupwd));)

  2. #12
    HaWe
    Gast
    dann sieht man nur das verkürzte pwd, also bei Eingabe im Textfeld
    "1234567"
    dann als strupwd nur "12345",
    und website_upwd auch "12345"

    d.h. hier kommen sie identisch an, obwohl strupwd eigentlich vorher länger war.
    im html String, steht es aber noch als &upwd=1234567
    Dabei funktioniert aber nach allen Tests ja cstringarg fehlerfrei.

    Mir ist die Logik des html-Codes und seiner Auswertung aber auch absolut schleierhaft: warum z.B. die Auswertung vor dem html Code steht, und was das ganze Brimborium mit client = wifiserver.available(); und client.available, client.flush und client.stop soll und der ganze Rest, und was ein "client" hier überhaupt ist und was wann macht.
    Geändert von HaWe (18.08.2018 um 14:51 Uhr)

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Wenn statt 1234567 nur 12345 ankommt, ist es doch nicht richtig, was cstringarg als Ergebnis liefert? website_upwd ist ja '12345', das ändert sich nicht, so weit ich das gesehen habe. Wichtig ist dann nur strupwd, was cstringarg liefert. Oder?

    Wenn Du mal website_upwd="abcde" schreibst, kommt dann als strupwd auch "12345" statt "1234567" oder kommt dann "abcde" vor dem if an?

  4. #14
    HaWe
    Gast
    genau, das strupwd wird aus dem html string mit cstringarg extrahiert, und cstringarg arbeitet aber korrekt nach allen Tests.
    Genau deshalb bin ich ja dermaßen ratlos.
    Es wird irgendwie mit dem Aufbau und der Logik des html codes und des wifi servers zu tun haben.

    Versuch du es dochmal selber mit ESP8266 und Arduino 1.8.5 zu debuggen, ich weiß nicht mehr, wo ich suchen soll.
    Ich kann dir gerne den kompletten lauffähigen Code hier posten.

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    ich hatte die Vermutung, dass er das "12345" vielleicht nicht aus der HTML-Eingabe nimmt sondern irgendwie aus website_upwd klaut.

  6. #16
    HaWe
    Gast
    nein, eigentlich nicht:
    readString ist der String, der von der html-Seite mit den Text-Eingabefeldern kommt, der wird in einen cstring namens strinput umgewandelt:
    Code:
        readString.toCharArray(strinput, MAXLEN);
    Dann wird in diesm strinput nach user name und pwd gefischt:
    Code:
     // cstringarg( char* haystack, char* vname, char* sarg )
        // haystack pattern: &varname=1234abc,  delimiters &, \n, \0, SPACE, EOF
        cstringarg(strinput, "uname", struname);  // uname
        cstringarg(strinput, "upwd", strupwd);   // upwd  
       //...
       if ( (strlen(strupwd)==strlen(website_upwd) ) 
             && (strcmp(website_upwd, strupwd )==0)        
           )   
        {
          authorized = true;
        //...
        }
    Hier mal der komplette, abgespeckte Code:

    Code:
    //----------------------------------------------------------------------------
    //  board: ESP8266 NodeMCU 1.0 (ESP12-E module)
    //  Arduino IDE 1.8.5
    //  ESP8266 core 2.4.0  
    //----------------------------------------------------------------------------
    
    
    // Wifi + website data 
    
    extern const char* ssid ="";              // WIFI network name
    extern const char* password ="";          // WIFI network password
    
    // define 
    char  website_uname[20] ="" ; //  website user name log in  "MyWebsiteLoginName"
    char  website_upwd[20] ="";  //  website user pwd log in   "MyWebsiteLoginPwd"
    char* website_title ="";     //  website caption           "MySiteCaption"
    char* website_url ="";       //  website url               "http:\\mysite.com"
    
    
    
    //----------------------------------------------------------------------------
    // OLED SSD1306
    
    #include <ESP_SSD1306.h>        // Modification of Adafruit_SSD1306 for ESP8266 compatibility
    #include <Adafruit_GFX.h>       // Needs a little change in original Adafruit library (See README.txt file)
    #include <Fonts/FreeSansBold12pt7b.h>        // 
    #include <Fonts/FreeSans9pt7b.h>            //
    //#include <Fonts/FreeMono12pt7b.h>          //
    
    // I2C Wire
    #include <Wire.h>
    
    #define SCL         D1      // SCL
    #define SDA         D2      // SDA    
    
    #define D12         10      // GPIO intern  
    #define OLED_RESET  10      // GPIO10=D12 Pin RESET signal  
    
    ESP_SSD1306    display(OLED_RESET);
    
    
    
    //----------------------------------------------------------------------------
    // IO pins  
    //----------------------------------------------------------------------------
    
    #define PIN_BTND3   D3      // Btn 0=D3 reset Alarm
    // #define PIN_IN4     D4      //  N/A
     
    #define PIN_OUT1    D5      //  out 
    #define PIN_OUT2    D7      //  out
    // #define PIN_OUT3    D8      //  N/A
    
    
    
    //----------------------------------------------------------------------------
    #include <ESP8266WiFi.h>
    #include <ESP8266WebServer.h>
    
    
    #define  ORANGE       255,102,0
    
    
    // WiFi Router
    
    #define     this_iph     200      // <<< local host ip  
    #define     http_port     80
    
    
    IPAddress    this_ip(192, 168, 2, this_iph); // <<< Feste lokale IP dieses ESP8266-Servers
    IPAddress    gateway(192, 168, 2, 1);       // <<< LAN Gateway IP
    IPAddress    subnet(255, 255, 255, 0);      // <<< LAN Subnet Mask
    
    WiFiServer   wifiserver(http_port);
    
    ESP8266WebServer lanserver(8081);
    
    bool      authorized = false;
    
    
    
    
    //----------------------------------------------------------------------------
    // Tools
    
    
    //----------------------------------------------------------------------------
    
    int16_t  strstrpos(char * haystack,  char * needle)   // find 1st occurance of substr in str
    {
       char *p = strstr(haystack, needle);
       if (p) return p - haystack;
       return -1;   // Not found = -1.
    }
    
    //----------------------------------------------------------------------------
    const int  MAXLEN = 1024;
    const int  TOKLEN = 64;
    
    char * cstringarg( char* haystack, char* vname, char* sarg ) {
       int i=0, pos=-1;
       unsigned char  ch=0xff;
       char  kini[3] = "&";       // start of varname: '&': 
       char  kequ[3] = "=";       // end of varname, start of argument: '='
       char  needle[TOKLEN]="";   // complete pattern:  &varname=abc1234
    
       //kequ[0] = '=';  // customize
       strcpy(sarg,"");
       strcpy(needle, kini);
       strcat(needle, vname);
       strcat(needle, kequ);
       pos = strstrpos(haystack, needle); 
       if(pos==-1) return sarg;
       pos=pos+strlen(vname)+2; // start of value = kini+vname+kequ   
       while( (ch!='&')&&(ch!='\0') ) {
          ch=haystack[pos+i];    
          if( (ch=='&')||(ch==';')||(ch==' ')||(ch=='\0') ||(ch=='\n')
            ||(i+pos>=strlen(haystack))||(i>TOKLEN-1) ) {
               sarg[i]='\0';
               return sarg;
          }       
          if( (ch!='&') ) {
              sarg[i]=ch;          
              i++;       
          }      
       } 
       return sarg;
    }
    
    
    
    //----------------------------------------------------------------------------
    // OLED dashboard
    //----------------------------------------------------------------------------
    void dashboard(int mode) {  
      display.clearDisplay();
    
      if (mode >= 0) {
        display.setCursor( 0, 0);   
        display.print(this_ip);
        display.setCursor (0, 16);       
        display.print(gateway);
        display.display();
    
        
      }   
      
      display.setFont();
    }
    
    
    //----------------------------------------------------------------------------
    // SETUP
    //----------------------------------------------------------------------------
    
    
    void setup() {
    
      int IORes;
    
      //STR_DEGREE[0] = CHR_DEGREE; // ° symbol as ANSI C string
    
      int progress = 0;
    
    
      //----------------------------------------
      Serial.begin(115200);
      delay(1000);
    
    
    
    
    
      //----------------------------------------
      // i2c: init
    
      Wire.pins(SDA, SCL);        // SDA, SCL
      Wire.begin();
      delay(1);
    
     
      //----------------------------------------
      // OLED
    
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)
    
      display.setFont();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.clearDisplay();
      display.setCursor( 0, 0);  display.print("OLED TEST OK");
      display.display();
      delay(1);
      Serial.println("OLED sensor init...");
     
    
      //----------------------------------------
      // Connect to WiFi network
      Serial.println();
      Serial.println();
      Serial.println("Connecting to Router: ");
      Serial.println( WiFi.gatewayIP().toString() );
    
      WiFi.begin(ssid, password);
      WiFi.config(this_ip, gateway, subnet);   // feste IP
    
      while (WiFi.status() != WL_CONNECTED) {
     
        delay(500);
        Serial.print(".");
    
        display.clearDisplay();
        display.setCursor( 0, 20);  display.print("WiFi connecting...");
    
        display.setCursor( 0, 40);  display.print((String)progress + "%");
        if (progress >= 98) {
          progress = 80;
          Serial.println();
        }
        display.display();
    
        if (progress < 10) progress += 5;
        else if (progress < 50) progress += 2;
        else if (progress < 90) progress += 1;
      }
      display.clearDisplay();
      progress = 100;
      display.setCursor( 0, 20);  display.print("WiFi connecting...");
      display.setCursor( 0, 40);  display.print((String)progress + "%");
      display.display();
      delay(300);
    
      Serial.println("");
      Serial.print("WiFi connected: ");
      Serial.println(WiFi.gatewayIP());
    
    
      //----------------------------------------
      // Start the WiFi server (-> www)
      wifiserver.begin();
      Serial.println("WiFi Server started");
    
      //----------------------------------------
      // Start the ESP LAN server (-> ESP client)
      lanserver.on("/",handleRoot) ;
      lanserver.on("/client/client0/", handleClients);
      delay(10);
      lanserver.on("/client/client1/", handleClients);
      delay(10);
      lanserver.on("/client/client2/", handleClients);
      delay(10);
      lanserver.on("/client/client3/", handleClients);
      delay(10);
      lanserver.begin();
      Serial.println("ESP Server started");
    
      // Print the IP address
      Serial.print("Use this URL to connect: ");
      Serial.print("http://");
      Serial.print(WiFi.localIP());
      Serial.print(":");
      Serial.print(http_port);
      Serial.println("/");
      Serial.print((String)website_url + ":" + http_port + "/");
    
      delay(1);
    
     
    
      //----------------------------------------
      // setup done
    
      dashboard(1);
      Serial.println("setup done \n");
    
    }
    
    
    
    //----------------------------------------------------------------------------
    // LOOP
    //----------------------------------------------------------------------------
    
    void loop() {
    
      static double ftmp;
      static unsigned long tsec=millis(), tms = millis();
      static int8_t  LEDmode=0;
     
    
        
      //---------------------------------------
      // Check log-in
     
       if (!authorized) {
        handleNotAuthorized();
        delay(100);    
      }
    
      if (authorized) {
        handleWebsite();
        delay(10);
      }
    
      lanserver.handleClient();
      delay(10);
    
    
      
      //---------------------------------------
      // Read local + Udp data  
      if ( millis() - tms >= 100 ) {    // refresh data rate
        tms = millis();   
    
        
        //---------------------------------------
        // display on OLED
        if ( millis() - tsec >= 4000 ) {
          tsec=millis();
          LEDmode++;
          if(LEDmode>8) LEDmode=0;
        }
        dashboard(LEDmode);
        delay(1);
      }
    
    
    }
    
    //----------------------------------------------------------------------------
    //----------------------------------------------------------------------------
    
    void handleNotAuthorized() {
      String readString="";
      char   strinput[MAXLEN], strupwd[TOKLEN], struname[TOKLEN], test[TOKLEN] ;
    
      WiFiClient client = wifiserver.available();
    
      //---------------------------------------
      // debug
      // authorized=true;
      
      strcpy(strinput, "");
      strcpy(strupwd, "");
      strcpy(struname, "");
    
      while ( client.connected() ) {
        if (authorized) return;
        
       
        readString.toCharArray(strinput, MAXLEN);
        // cstringarg( char* haystack, char* vname, char* sarg )
        // haystack pattern: &varname=1234abc,  delimiters &, \n, \0, SPACE, EOF
        cstringarg(strinput, "uname", struname);  // uname
        cstringarg(strinput, "upwd", strupwd);   // upwd    
        
        // debug
        Serial.print("strupwd     >>>"); Serial.print(strupwd); Serial.println("<<<");
        Serial.print("website_upwd>>>"); Serial.print(website_upwd); Serial.println("<<<");
    
        
        if ( (strlen(strupwd)==strlen(website_upwd) ) 
             && (strcmp(website_upwd, strupwd )==0)        
           )   
        {
          authorized = true;
          //debug
          //Serial.print("check: authorized="); Serial.println(authorized);
          readString = "";
          return;
        }
    
        if ( client.available() ) {
          char c = client.read();
    
          //read char by request
          if (readString.length() < TOKLEN) {
    
            //store characters to string
            readString += c;
            Serial.println(c);
          }
    
          //if HTTP request has ended
          if (c == '\n') {
            client.flush();               
            
            
            //now output html data header
    
            String script = "";
    
            script += ("HTTP/1.1 401 Log-In Required");
            script += ("Content-Type: text/html \n");
            script += ("\n");  //  do not forget this one //????
            script += ("<!DOCTYPE html> \n");
            script += ("<html> \n");
            script += ("<head> \n");
    
    
            // utf-8 für "°" Zeichen
            script +=  "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ;
            script +=  "<title>" ;
            script +=  website_title ;
            script +=  "</title> \n" ;
            script +=  "</head> \n" ;
            script +=  "<body> \n" ;
    
            script += "<h1><p style=\"color:rgb(255,0,191);\"> " + (String)website_url ;
            script += (String)": &nbsp; <wbr> <wbr> " + "Not authorized !</p> </h1> \n" ;
            script += ("<h2><p style=\"color:rgb(255,0,191);\"> log in to proceed: </p> </h2> \n");
    
            script += ("<FORM ACTION='/' method=GET > \n");
            script += ("<h2>user name:  <INPUT TYPE=text NAME='uname' VALUE=''  MAXLENGTH='50'> </h2> \n");
            script += ("<h2>password :  <INPUT TYPE=PASSWORD NAME='upwd' VALUE='' MAXLENGTH='50'> </h2> \n");
    
            script += ("<h2><INPUT TYPE=SUBMIT></h2> \n");
    
            script += ("</FORM> \n");
            script += ("<BR> \n");
            script += ("</body> \n");
            script += ("</html> \n");
    
            client.print(script);
    
            //stopping client
            client.stop();                        
     
            delay(1);
    
            //clearing string for next read
            readString = "";
          }
        }
        delay(1);
      }
    }
    
    
    //----------------------------------------------------------------------------
    
    void handleWebsite() {
    
      WiFiClient client = wifiserver.available();
    
      //---------------------------------------
      // Check if a client has connected
    
    
      // Read the first line of the request
      String request = client.readStringUntil('\r');
      Serial.println(request);
      client.flush();
    
    
    
      //---------------------------------------
      // LogOut
      if (request.indexOf("/logout") != -1)  {
        authorized = false;
        return;
      }
    
    
      delay(1);
    
      //---------------------------------------
      // Return the response
    
      String script = "";
    
      // init website
    
      script += ("HTTP/1.1 200 OK \n");
      script += ("Content-Type: text/html \n");
      script += ("\n"); //  do not forget this one
      script += ("<!DOCTYPE html> \n");
      script += ("<html> \n");
    
      // head + title
      script += ("<head> \n");
      // autom. Aktualisierung alle 20 sec.
    
      script += "<meta http-equiv=\"refresh\" content=\"20; URL=";
      script += (String)website_url + ":" + (String)http_port + "\"> \n" ;
    
    
      // utf-8 für "°" Zeichen
      script += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ;
      script += ("<title>");
      script += (website_title);
      script += ("</title> \n");
      script += ("</head> \n");
    
      // body + caption
      script += ("<body> \n");
      script += ("<h1> <p> ");
      script += ("<font style=\"color:rgb(255,0,204);\"> HELLO WORLD! ");
      script += ("&nbsp; <wbr> <wbr> ");
      script += ("<font style=\"color:rgb(0,205,102);\"> Welcome to " + (String)website_url );
      script += ("! </p> </h1>  "); // script+= ("! </p> </h1> \n");
    
      
      delay(1);
    
      
      //---------------------------------------
      script +=  "<h2> <br> \n  HEIMSERVER  <br> \n </h2>";
      //---------------------------------------
      // remote buttons Server
      // <input type="button" value="submit" style="height: 100px; width: 100px; left: 250; top: 250;">
      // <button style=\"height:200px;width:200px\"> </button>
    
     
      
      client.print(script);
      script = "";
    
    
      //---------------------------------------
      // sensors  Server
      // chart table
      //---------------------------------------
      // text font Courier, color black
      script += ("<p> <font face=\"courier\"> "); // <<< Courier
      script += "<h2> ";
      script += "<p style=\"color:rgb(0,0,0);\" > </p>  " ;
      script += ("<br> \n");  
      script += "</h2>";
    
      client.print(script);
      script = "";
    
    
      script += ("<br> \n");
    
    
      // log out
      script += ("<h3>Log Out: ");
      script += ("<a href=\" /logout\"\"> <button style=\"height:70px;width:140px\" > Log Out </button></a> </h3> ");
    
      script += WiFi.localIP().toString() +" "+ (String)ssid + " <br>" ;
      script += "</font> </p> \n";
    
      script += "</body> \n";
      script += "</html> \n";
    
      client.print(script);
    
      delay(1);
    
    }
    
    //----------------------------------------------------------------------------
    // handle root +clients
    //----------------------------------------------------------------------------
    
    void handleRoot() {
       handleClients();
    }
    
    
    //----------------------------------------------------------------------------
    
    void handleClients() {
      double ftmp;
      String msgtok;
    
     
     
      //------------------------------------------
    
      //client-Werte auch bei Url-Aufruf zurückgeben
     
      String message = "*** ";
      // re CLIENT 0
      /*
      message += (String)"&c0t1=" + c0t1.sact + "&c0h1=" + c0h1.sact;
      message += (String)"&c0t2=" + c0t2.sact + "&c0h2=" + c0h2.sact;
      message += "&c0out1=" + (String)c0out1 + "&c0out2=" + (String)c0out2 + "&c0out3=" + (String)c0out3 ;
      */
      message += " ###";
      //Serial.println(message);
      lanserver.send(200, "text/plain", message);
    
    }
    
    
    
    // END OF FILE
    Geändert von HaWe (18.08.2018 um 18:32 Uhr)

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Manche Bibliotheken fehlen bei mir:

    //#include <ESP_SSD1306.h> // Modification of Adafruit_SSD1306 for ESP8266 compatibility
    //#include <Adafruit_GFX.h> // Needs a little change in original Adafruit library (See README.txt file)
    //#include <Fonts/FreeSansBold12pt7b.h> //
    //#include <Fonts/FreeSans9pt7b.h> //
    //#include <Fonts/FreeMono12pt7b.h> //

    Die habe ich deshalb rausgenommen. Dann kann er mit display nichts anfangen: 'display' was not declared in this scope

  8. #18
    HaWe
    Gast
    Zitat Zitat von Moppi Beitrag anzeigen
    Manche Bibliotheken fehlen bei mir:

    //#include <ESP_SSD1306.h> // Modification of Adafruit_SSD1306 for ESP8266 compatibility
    //#include <Adafruit_GFX.h> // Needs a little change in original Adafruit library (See README.txt file)
    //#include <Fonts/FreeSansBold12pt7b.h> //
    //#include <Fonts/FreeSans9pt7b.h> //
    //#include <Fonts/FreeMono12pt7b.h> //

    Die habe ich deshalb rausgenommen. Dann kann er mit display nichts anfangen: 'display' was not declared in this scope
    ich hatte sie drin gelassen, weil man dann auch strings aufs OLED ausgeben kann, unabh. von Serial.
    wenn du kein OLED hast, macht das dann auch nichts.
    Adafriut libs gehen über den library manager oder hier: https://github.com/adafruit/Adafruit-GFX-Library
    <ESP_SSD1306.h> ist hier: https://github.com/ThingPulse/esp8266-oled-ssd1306

  9. #19
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    <ESP_SSD1306.h>,<Adafruit_GFX.h>, <Fonts/FreeSansBold12pt7b.h>: Fehler beim Kompilieren für das Board NodeMCU 1.0 (ESP-12E Module)


    Aber was mir noch aufgefallen ist: dieses cstringarg ist noch nicht ganz durchdacht.
    Da wird doch GET verwendet, um die Daten an den Server zu übertragen. Von daher müsste die Übermittlung der Daten in etwa so aussehen: http://.../xxxxx.htm?name=uschi&password=12345

    Ist zwar schon eine Zeit her, als ich damit gearbeitet habe, aber so müsste es sein. Diese Daten werden vom Browser verschickt, so dass man auf diesen Übermittlungsstring nur bedingt Einfluß hat. Man muss darauf achten, dass alle Feldbezeichner (für name und password das &-Zeichen vorangestellt haben. So wird es dann wohl auch sein. Aber wenn nicht und wenn der String dann so aussieht (wie ich oben hingeschrieben habe), kommt es mit dieser cstringarg zu einer Ausnahme, weil dort nur mit dem & operiert, dass der cstringarg übergeben wird:

    Code:
    Test mit cstringarg()
    
    haystack: index.htm?upwd1=testupwd1&upwd2=testupwd2 &upwd13=testupwd13&upwd224=testupwd224 EndeTststring
    needle: &upwd1=
    *p: 
    Exception (28):
    cstringarg verursacht demnach einen Fehler, wenn etwas nicht gefunden wird.

    Was mir als Bindeglied noch fehlt, ist so ein String, vom Webbrowser, so wie er an den Server übermittelt wird - das wird in readString übertragen. So weit habe ich das nachvollzogen und bis auf die Ausnahme oben ist mir bis jetzt nicht aufgefallen, dass es nicht funktioniert. Ich hätte jetzt den Gedanken, selber das so zu programmieren, dass ich die Kommunikation mit dem Browser ausprobieren kann. Aber das ist dann sicherlich abweichend von dem Code, den Du verwendest. Und wenn es dann bei mir funktionieren würde, nutzt Dir das nicht.
    Geändert von Moppi (19.08.2018 um 08:31 Uhr)

  10. #20
    HaWe
    Gast
    Zitat Zitat von Moppi Beitrag anzeigen
    <ESP_SSD1306.h>,<Adafruit_GFX.h>, <Fonts/FreeSansBold12pt7b.h>: Fehler beim Kompilieren für das Board NodeMCU 1.0 (ESP-12E Module)


    Aber was mir noch aufgefallen ist: dieses cstringarg ist noch nicht ganz durchdacht.
    Da wird doch GET verwendet, um die Daten an den Server zu übertragen. Von daher müsste die Übermittlung der Daten in etwa so aussehen: http://.../xxxxx.htm?name=uschi&password=12345

    Ist zwar schon eine Zeit her, als ich damit gearbeitet habe, aber so müsste es sein. Diese Daten werden vom Browser verschickt, so dass man auf diesen Übermittlungsstring nur bedingt Einfluß hat. Man muss darauf achten, dass alle Feldbezeichner (für name und password das &-Zeichen vorangestellt haben. So wird es dann wohl auch sein. Aber wenn nicht und wenn der String dann so aussieht (wie ich oben hingeschrieben habe), kommt es mit dieser cstringarg zu einer Ausnahme, weil dort nur mit dem & operiert, dass der cstringarg übergeben wird:

    Code:
    Test mit cstringarg()
    
    haystack: index.htm?upwd1=testupwd1&upwd2=testupwd2 &upwd13=testupwd13&upwd224=testupwd224 EndeTststring
    needle: &upwd1=
    *p: 
    Exception (28):
    cstringarg verursacht demnach einen Fehler, wenn etwas nicht gefunden wird.

    Was mir als Bindeglied noch fehlt, ist so ein String, vom Webbrowser, so wie er an den Server übermittelt wird - das wird in readString übertragen. So weit habe ich das nachvollzogen und bis auf die Ausnahme oben ist mir bis jetzt nicht aufgefallen, dass es nicht funktioniert. Ich hätte jetzt den Gedanken, selber das so zu programmieren, dass ich die Kommunikation mit dem Browser ausprobieren kann. Aber das ist dann sicherlich abweichend von dem Code, den Du verwendest. Und wenn es dann bei mir funktionieren würde, nutzt Dir das nicht.
    danke für den Hinweis!
    Ich war tatsächlich immer der Meinung, jeder Variablenname würde immer mit einem '&' beginnen und mit einem '=' enden, direkt anschließend kommt dann der Variablenwert, als arg.
    Dann wäre es korrekt, dass bei xxxx nur diese Muster &xxxx= gesucht und gefunden werden, ansonsten eben "nicht gefunden", also Rückgabewert -1, ein Laufzeitfehler dürfte allerdings nicht auftreten.

    Stimmt es also, dass auch '?' ein Start-delimiter sein kann? Das einzubauen wäre nicht kompliziert, allerdings beträfe es ja nur die erste Textvariable (uname) und nicht die zweite (upwd), indes nur bei der zweiten tritt der Fehler mit überlangen Eingabestrings ja auf - und der fängt ja korrekt mit '&' an und hört korrekt mit '=' auf.

    Einen "Standard-GET-html-string kann ich dir nicht zeigen, denn davon verstehe ich nichts - du müsstest ihn dir selber aus dem Programm per Serial.println mal genau angucken, sowohl in meinem Programm als auch in anderen.

    Ich habe hier auch noch einmal einen noch stärker verkürzten Testcode ohne OLED und mit DHCP IP (die wird per Serial am Anfang angezeigt, dann kannst du dich damit per Browser anmelden (z.B. http://192.168.2.111)


    Code:
    //----------------------------------------------------------------------------
    //  board: ESP8266 NodeMCU 1.0 (ESP12-E module)
    //  Arduino IDE 1.8.5
    //  ESP8266 core 2.4.0
    //----------------------------------------------------------------------------
    
    
    // Wifi + website data
    
    const char* ssid = "SSID";             // WIFI network name
    const char* password = "PSK";         // WIFI network password
    
    // define
    char  website_uname[20] = "xx" ; //  website user name log in  "MyWebsiteLoginName"
    char  website_upwd[20] = "yy"; //  website user pwd log in   "MyWebsiteLoginPwd"
    const char* website_title = "#5021";    //  website caption           "MySiteCaption"
    const char* website_url = "http://givemeluck";      //  website url               "http:\\mysite.com"
    int http_port = 80;
    
    //----------------------------------------------------------------------------
    #include <ESP8266WiFi.h>
    #include <ESP8266WebServer.h>
    
    WiFiServer   wifiserver(http_port);
    ESP8266WebServer lanserver(8081);
    bool      authorized = false;
    
    //----------------------------------------------------------------------------
    // handle root +clients
    //----------------------------------------------------------------------------
    
    void handleRoot() {
      handleClients();
    }
    
    
    //----------------------------------------------------------------------------
    
    void handleClients() {
      String msgtok;
      //------------------------------------------
    
      //client-Werte auch bei Url-Aufruf zurückgeben
    
      String message = "*** ";
      // re CLIENT 0
      /*
        message += (String)"&c0t1=" + c0t1.sact + "&c0h1=" + c0h1.sact;
        message += (String)"&c0t2=" + c0t2.sact + "&c0h2=" + c0h2.sact;
        message += "&c0out1=" + (String)c0out1 + "&c0out2=" + (String)c0out2 + "&c0out3=" + (String)c0out3 ;
      */
      message += " ###";
      //Serial.println(message);
      lanserver.send(200, "text/plain", message);
    
    }
    
    //----------------------------------------------------------------------------
    // Tools
    //----------------------------------------------------------------------------
    
    int16_t  strstrpos(char * haystack,  char * needle)   // find 1st occurance of substr in str
    {
      char *p = strstr(haystack, needle);
      if (p) return p - haystack;
      return -1;   // Not found = -1.
    }
    
    //----------------------------------------------------------------------------
    const int  MAXLEN = 1024;
    const int  TOKLEN = 64;
    
    char * cstringarg( char* haystack, char* vname, char* sarg ) {
      int i = 0, pos = -1;
      unsigned char  ch = 0xff;
      char  kini[3] = "&";       // start of varname: '&':
      char  kequ[3] = "=";       // end of varname, start of argument: '='
      char  needle[TOKLEN] = ""; // complete pattern:  &varname=abc1234
    
      //kequ[0] = '=';  // customize
      strcpy(sarg, "");
      strcpy(needle, kini);
      strcat(needle, vname);
      strcat(needle, kequ);
      pos = strstrpos(haystack, needle);
      if (pos == -1) return sarg;
      pos = pos + strlen(vname) + 2; // start of value = kini+vname+kequ
      while ( (ch != '&') && (ch != '\0') ) {
        ch = haystack[pos + i];
        if ( (ch == '&') || (ch == ';') || (ch == ' ') || (ch == '\0') || (ch == '\n')
             || (i + pos >= strlen(haystack)) || (i > TOKLEN - 1) ) {
          sarg[i] = '\0';
          return sarg;
        }
        if ( (ch != '&') ) {
          sarg[i] = ch;
          i++;
        }
      }
      return sarg;
    }
    
    
    //----------------------------------------------------------------------------
    // SETUP
    //----------------------------------------------------------------------------
    
    
    void setup() {
    
      //STR_DEGREE[0] = CHR_DEGREE; // ° symbol as ANSI C string
    
    
      //----------------------------------------
      Serial.begin(115200);
      delay(1000);
    
      //----------------------------------------
      // Connect to WiFi network
      Serial.println();
      Serial.println();
      Serial.println("Connecting to Router: ");
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
    
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.print("WiFi connected: ");
      Serial.println(WiFi.gatewayIP());
    
    
      //----------------------------------------
      // Start the WiFi server (-> www)
      wifiserver.begin();
      Serial.println("WiFi Server started");
    
      //----------------------------------------
      // Start the ESP LAN server (-> ESP client)
      lanserver.on("/", handleRoot) ;
      lanserver.on("/client/client0/", handleClients);
      delay(10);
      lanserver.on("/client/client1/", handleClients);
      delay(10);
      lanserver.on("/client/client2/", handleClients);
      delay(10);
      lanserver.on("/client/client3/", handleClients);
      delay(10);
      lanserver.begin();
      Serial.println("ESP Server started");
    
      // Print the IP address
      Serial.print("Use this URL to connect: ");
      Serial.print("http://");
      Serial.print(WiFi.localIP());
      Serial.print(":");
      Serial.print(http_port);
      Serial.println("/");
      Serial.print((String)website_url + ":" + http_port + "/");
    
      delay(1);
    
      //----------------------------------------
      // setup done
      Serial.println("setup done \n");
    }
    
    //----------------------------------------------------------------------------
    // LOOP
    //----------------------------------------------------------------------------
    
    void loop() {
    
      //---------------------------------------
      // Check log-in
    
      if (!authorized) {
        handleNotAuthorized();
        delay(100);
      }
    
      if (authorized) {
        handleWebsite();
        delay(10);
      }
    
      lanserver.handleClient();
      delay(10);
    }
    
    //----------------------------------------------------------------------------
    //----------------------------------------------------------------------------
    
    void handleNotAuthorized() {
      String readString = "";
      char   strinput[MAXLEN], strupwd[TOKLEN], struname[TOKLEN] ;
    
      WiFiClient client = wifiserver.available();
    
      //---------------------------------------
      // debug
      // authorized=true;
    
      strcpy(strinput, "");
      strcpy(strupwd, "");
      strcpy(struname, "");
    
      while ( client.connected() ) {
        if (authorized) return;
    
    
        readString.toCharArray(strinput, MAXLEN);
        // cstringarg( char* haystack, char* vname, char* sarg )
        // haystack pattern: &varname=1234abc,  delimiters &, \n, \0, SPACE, EOF
        cstringarg(strinput, "uname", struname);  // uname
        cstringarg(strinput, "upwd", strupwd);   // upwd
    
        // debug
        Serial.print("strupwd     >>>"); Serial.print(strupwd); Serial.println("<<<");
        Serial.print("website_upwd>>>"); Serial.print(website_upwd); Serial.println("<<<");
    
    
        if ( (strlen(strupwd) == strlen(website_upwd) )
             && (strcmp(website_upwd, strupwd ) == 0)
           )
        {
          authorized = true;
          //debug
          //Serial.print("check: authorized="); Serial.println(authorized);
          readString = "";
          return;
        }
    
        if ( client.available() ) {
          char c = client.read();
    
          //read char by request
          if (readString.length() < TOKLEN) {
    
            //store characters to string
            readString += c;
            Serial.println(c);
          }
    
          //if HTTP request has ended
          if (c == '\n') {
            client.flush();
    
    
            //now output html data header
    
            String script = "";
    
            script += ("HTTP/1.1 401 Log-In Required");
            script += ("Content-Type: text/html \n");
            script += ("\n");  //  do not forget this one //????
            script += ("<!DOCTYPE html> \n");
            script += ("<html> \n");
            script += ("<head> \n");
    
    
            // utf-8 für "°" Zeichen
            script +=  "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ;
            script +=  "<title>" ;
            script +=  website_title ;
            script +=  "</title> \n" ;
            script +=  "</head> \n" ;
            script +=  "<body> \n" ;
    
            script += "<h1><p style=\"color:rgb(255,0,191);\"> " + (String)website_url ;
            script += (String)": &nbsp; <wbr> <wbr> " + "Not authorized !</p> </h1> \n" ;
            script += ("<h2><p style=\"color:rgb(255,0,191);\"> log in to proceed: </p> </h2> \n");
    
            script += ("<FORM ACTION='/' method=GET > \n");
            script += ("<h2>user name:  <INPUT TYPE=text NAME='uname' VALUE=''  MAXLENGTH='50'> </h2> \n");
            script += ("<h2>password :  <INPUT TYPE=PASSWORD NAME='upwd' VALUE='' MAXLENGTH='50'> </h2> \n");
    
            script += ("<h2><INPUT TYPE=SUBMIT></h2> \n");
    
            script += ("</FORM> \n");
            script += ("<BR> \n");
            script += ("</body> \n");
            script += ("</html> \n");
    
            client.print(script);
    
            //stopping client
            client.stop();
    
            delay(1);
    
            //clearing string for next read
            readString = "";
          }
        }
        delay(1);
      }
    }
    
    
    //----------------------------------------------------------------------------
    
    void handleWebsite() {
    
      WiFiClient client = wifiserver.available();
    
      //---------------------------------------
      // Check if a client has connected
    
    
      // Read the first line of the request
      String request = client.readStringUntil('\r');
      Serial.println(request);
      client.flush();
    
      //---------------------------------------
      // LogOut
      if (request.indexOf("/logout") != -1)  {
        authorized = false;
        return;
      }
      
      delay(1);
    
      //---------------------------------------
      // Return the response
    
      String script = "";
    
      // init website
    
      script += ("HTTP/1.1 200 OK \n");
      script += ("Content-Type: text/html \n");
      script += ("\n"); //  do not forget this one
      script += ("<!DOCTYPE html> \n");
      script += ("<html> \n");
    
      // head + title
      script += ("<head> \n");
      // autom. Aktualisierung alle 20 sec.
    
      script += "<meta http-equiv=\"refresh\" content=\"20; URL=";
      script += (String)website_url + ":" + (String)http_port + "\"> \n" ;
    
    
      // utf-8 für "°" Zeichen
      script += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ;
      script += ("<title>");
      script += (website_title);
      script += ("</title> \n");
      script += ("</head> \n");
    
      // body + caption
      script += ("<body> \n");
      script += ("<h1> <p> ");
      script += ("<font style=\"color:rgb(255,0,204);\"> HELLO WORLD! ");
      script += ("&nbsp; <wbr> <wbr> ");
      script += ("<font style=\"color:rgb(0,205,102);\"> Welcome to " + (String)website_url );
      script += ("! </p> </h1>  "); // script+= ("! </p> </h1> \n");
    
    
      delay(1);
    
    
      //---------------------------------------
      script +=  "<h2> <br> \n  HEIMSERVER  <br> \n </h2>";
      //---------------------------------------
      // remote buttons Server
      // <input type="button" value="submit" style="height: 100px; width: 100px; left: 250; top: 250;">
      // <button style=\"height:200px;width:200px\"> </button>
    
    
    
      client.print(script);
      script = "";
    
    
      //---------------------------------------
      // sensors  Server
      // chart table
      //---------------------------------------
      // text font Courier, color black
      script += ("<p> <font face=\"courier\"> "); // <<< Courier
      script += "<h2> ";
      script += "<p style=\"color:rgb(0,0,0);\" > </p>  " ;
      script += ("<br> \n");
      script += "</h2>";
    
      client.print(script);
      script = "";
    
    
      script += ("<br> \n");
    
    
      // log out
      script += ("<h3>Log Out: ");
      script += ("<a href=\" /logout\"\"> <button style=\"height:70px;width:140px\" > Log Out </button></a> </h3> ");
    
      script += WiFi.localIP().toString() + " " + (String)ssid + " <br>" ;
      script += "</font> </p> \n";
    
      script += "</body> \n";
      script += "</html> \n";
    
      client.print(script);
    
      delay(1);
    
    }
    - - - Aktualisiert - - -

    beide codes lassen sich aber fehlerfrei compilieren bei mir, evtl versuche es unmittelbar ein 2. oder 3. Mal hinterher. Manchmal liegt es an einer temp. Datei, die momentan nicht überschrieben werden konnte.
    Falls es doch nicht funzt: wie ist die exakte vollständige Fehlermeldung?
    Geändert von HaWe (19.08.2018 um 10:27 Uhr)

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Ähnliche Themen

  1. html-Code für nodeMCU mit Arduino IDE + Wifi libs
    Von HaWe im Forum Arduino -Plattform
    Antworten: 7
    Letzter Beitrag: 14.08.2018, 18:30
  2. Pegelwandler RX/TX Arduino ESP8266
    Von Cysign im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 05.02.2018, 23:29
  3. ESP8266 boards per per Arduino-IDE programmieren?
    Von HaWe im Forum Arduino -Plattform
    Antworten: 27
    Letzter Beitrag: 10.06.2017, 15:19
  4. arduino ide mit esp8266
    Von NotEvil im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 4
    Letzter Beitrag: 12.01.2017, 14:17
  5. HTML-Code (scripts)
    Von Technik =) im Forum Umfragen
    Antworten: 6
    Letzter Beitrag: 10.10.2008, 09:21

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen