- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 10 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 97

Thema: esp8266, Arduino IDE: neuer Versuch: warum wird website sofort beendet?

  1. #1
    HaWe
    Gast

    esp8266, Arduino IDE: neuer Versuch: warum wird website sofort beendet?

    Anzeige

    Powerstation Test
    hallo,
    ich will nochmal einen Anlauf starten:

    Board ESP-12E nodeMCU (esp8266),
    Arduino Board core nodeMCU 1.0, version 2.5.2

    wer kann sagen, warum die hier aufgebaute Website zum Eingeben von username und passwort unter Version 2.5.2 zwar kurz aufgebaut wird, dann aber sofort beendet wird?
    Der Fehler tritt unter nodeMCU 1.0, version 2.4.0 noch NICHT auf.

    Vermutlich ist ein Fehler drin versteckt, der bei der alten core Version geduldet wird, aber unter der neuen dann doch als Fehler sichtbar wird.
    Nur: Wo ist der Fehler?


    Code:
    bool authorized=false;
    
    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;
    
        if ( client.available() ) {
          char c = client.read();
    
          //read char by request
          readString = "";
          while ( (readString.length() < TOKLEN) && (c != '\n') ) {
              readString += c;
              c = client.read();
          }
    
          readString.toCharArray(strinput, MAXLEN);
         // cstringarg(strinput, "uname", struname); // uname
         // cstringarg(strinput, "upwd", strupwd);  // upwd
     
          if(strstr(website_upwd,strupwd)!=NULL & strstr(website_uname,struname)!=NULL)
          {
            authorized = true;
            readString = "";
            return;           
            // return;  // <<< selbes Ergebnis, egal ob kommentiert oder auskommentiert
          }    
          
          //if HTTP request has ended
          if (c == '\n') {
             client.flush();
    
            //now output html data header
    
            String script = "";
    
            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");
            
            script += ("<head> \n");
    
            // utf-8 für "°" Zeichen
            script +=  "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ;
            script +=  "<title>" ;        
            script +=  "</title> \n" ;
            script +=  "</head> \n" ;
            script +=  "<body> \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);
      }
    }

    Website in Firefox:
    (Seite wird kurz aufgebaut, dann sofort wieder weg, stattdessen Fehler-Website:
    Code:
    Fehler: Verbindung unterbrochen
    
    Die Verbindung zum Server wurde zurückgesetzt, während die Seite geladen wurde.
    
        Die Website könnte vorübergehend nicht erreichbar sein, versuchen Sie es bitte später nochmals.
        Wenn Sie auch keine andere Website aufrufen können, überprüfen Sie bitte die Netzwerk-/Internetverbindung.
        Wenn Ihr Computer oder Netzwerk von einer Firewall oder einem Proxy geschützt wird, stellen Sie bitte sicher, 
        dass Firefox auf das Internet zugreifen darf.
    Serial Konsole, neuer core:
    Code:
    strupwd     >>><<<
    website_upwd>>>admin<<<
    readString>>>GET /logout HTTP/1.1 
    GET /logout HTTP/1.1
    Bei der alten core Version werden diese 4 Zeilen NICHT seriell ausgegeben, die Login-Seite steht stabil und wartet auf Eingaben.


    Wer hat die rettende Idee?
    Geändert von HaWe (21.10.2019 um 16:11 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Solang eine Verbindung zum Client besteht, würde ich kein client.stop() senden. Die Disconnect-Nachricht könnte vielleicht daher kommen. Probehalber vor diesem Befehl ein großzügiges delay(x) von mehreren Sekunden einbauen. Sehen, wie sich das Verhalten dann darstellt. Wird die Seite dann aufgebaut, verschwindet aber nach ein paar Sekunden und es erscheint wieder die Disconnect-Message, dann wird es wohl am client.stop() liegen, das die Verbindung unterbricht.


    MfG

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    auch wenns englisch ist

    https://forum.arduino.cc/index.php?topic=245829.0

    da wird empfohlen auch vor dem stop den empfangspuffer zu leeren!

    und das flush gehört natürlich wie Moppi schon sagte direkt vor das stop um sicher zu gehen dass alle Daten transferiert worden sind bevor man den Socket schließt
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    HaWe
    Gast
    hallo,
    danke, der test hat immerhin schon funktioniert:
    Die Seite wird jetzt nach delay(1000) ca. 1 sec lang angezeigt und danach dann abgebrochen mit derselben obigen Fehlermeldung.
    Was kann man jetzt machen?

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    ich korrigiere meine Aussage, erst flush(), dann RX leer machen, dann delay(1000), dann stop()
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  6. #6
    HaWe
    Gast
    Zitat Zitat von Ceos Beitrag anzeigen
    ich korrigiere meine Aussage, erst flush(), dann RX leer machen, dann delay(1000), dann stop()
    danke, nur verstehe ich jetzt noch nicht was genau wohin soll,
    kannst du da mal bitte direkt in meinem Code korrigieren und in code tags posten?

    edit: was bedeutet z.B. auch "RX leer machen"?

    Code:
            //stopping client
            client.flush();
            delay(1000); // debug
            client.stop();
    das macht bis jetzt noch keinen Unterschied (bricht ebenfalls wieder nach ca. 1 sec. ab, ohne delay(1000) auch wieder sofort)...

    Code:
    bool authorized=false;
    
    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;
    
        if ( client.available() ) {
          char c = client.read();
    
          //read char by request
          readString = "";
          while ( (readString.length() < TOKLEN) && (c != '\n') ) {
              readString += c;
              c = client.read();
          }
    
          readString.toCharArray(strinput, MAXLEN);
         // cstringarg(strinput, "uname", struname); // uname
         // cstringarg(strinput, "upwd", strupwd);  // upwd
     
          if(strstr(website_upwd,strupwd)!=NULL & strstr(website_uname,struname)!=NULL)
          {
            authorized = true;
            readString = "";
            return;           
            // return;  // <<< selbes Ergebnis, egal ob kommentiert oder auskommentiert
          }    
          
          //if HTTP request has ended
          if (c == '\n') {
    
            //now output html data header
    
            String script = "";
    
            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");
            
            script += ("<head> \n");
    
            // utf-8 für "°" Zeichen
            script +=  "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ;
            script +=  "<title>" ;        
            script +=  "</title> \n" ;
            script +=  "</head> \n" ;
            script +=  "<body> \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.flush();
            delay(1000); // debug
            client.stop();
    
            //clearing string for next read
            //readString = "";
          }
        }
        delay(1);
      }
    }
    Geändert von HaWe (21.10.2019 um 16:11 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich hatte nochmal bei flush() nachgelesen. Mein Verständnis war jetzt so: Es soll Zeichen, die noch nicht übertragen wurden, aus dem Puffer entfernen. Ich würde erst client.print(..), dann delay(...), dann client.flush(), dann client.stop().

  8. #8
    HaWe
    Gast
    Code:
    bool authorized=false;
    
    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;
    
        if ( client.available() ) {
          char c = client.read();
    
          //read char by request
          readString = "";
          while ( (readString.length() < TOKLEN) && (c != '\n') ) {
              readString += c;
              c = client.read();
          }
    
          readString.toCharArray(strinput, MAXLEN);
         // cstringarg(strinput, "uname", struname); // uname
         // cstringarg(strinput, "upwd", strupwd);  // upwd
     
          if(strstr(website_upwd,strupwd)!=NULL & strstr(website_uname,struname)!=NULL)
          {
            authorized = true;
            readString = "";
            return;           
            // return;  // <<< selbes Ergebnis, egal ob kommentiert oder auskommentiert
          }    
          
          //if HTTP request has ended
          if (c == '\n') {
    
            //now output html data header
    
            String script = "";
    
            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");
            
            script += ("<head> \n");
    
            // utf-8 für "°" Zeichen
            script +=  "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ;
            script +=  "<title>" ;        
            script +=  "</title> \n" ;
            script +=  "</head> \n" ;
            script +=  "<body> \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);
            
            delay(1000); // debug        
            //stopping client
            client.flush(); 
            client.stop();
    
            //clearing string for next read
            //readString = "";
          }
        }
        delay(1);
      }
    }
    so?

    das macht auch noch genau dieselben Fehler sowohl mit als auch ohne delay(1000);
    Geändert von HaWe (21.10.2019 um 16:12 Uhr)

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    mal so versuchen:

    Code:
    while (client.connected()){}
    client.stop();
    statt

    Code:
            delay(1000); // debug        
            //stopping client
            client.flush(); 
            client.stop();


    PS: ich habe glaub ich kein nodeMCU mit Version 2.5.x

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    flush löst nur das senden verbleibender Bytes aus dem FIFO/internen Puffer aus (ungefähr wie beim trennen eines USB DAtenträger um keine Daten im Puffer zu verlieren)
    delay kommt danach, da die daten auch erst übertragen werden müssen
    dann sollte man folgende Schleife einbauen
    Code:
    while(client.connected()) {
       while(client.available()) {
          Serial.write(client.read());
       }
    }
    und DANN erst schließen

    das Serial.write() ist nur zu Debugzwecken und du kannst einfach in eine dummy variable auslesen wenn die restlichen Daten unwichtig sind, abe erstmal mit Debug Ausgabe um zu wissen ob der Browser überhaupt noch was sendet
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Seite 1 von 10 123 ... LetzteLetzte

Ähnliche Themen

  1. arduino ide mit esp8266
    Von NotEvil im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 4
    Letzter Beitrag: 12.01.2017, 15:17
  2. Raspberry Pi 3: Neuer Bastelrechner ist ab sofort verfügbar
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 4
    Letzter Beitrag: 29.02.2016, 21:56
  3. [ERLEDIGT] Google wird am Lenovo-Tablet ohne Zutun beendet
    Von oberallgeier im Forum Offtopic und Community Tratsch
    Antworten: 5
    Letzter Beitrag: 24.11.2015, 09:02
  4. Funktion wird nicht richtig beendet
    Von kowolfgang im Forum C - Programmierung (GCC u.a.)
    Antworten: 16
    Letzter Beitrag: 31.12.2008, 17:37
  5. schieberegister neuer versuch...
    Von Bluesmash im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 12
    Letzter Beitrag: 11.07.2005, 22:10

Berechtigungen

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

12V Akku bauen