- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 97

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    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.

  2. #2
    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);
            while(client.connected()) {
               delay(10);
    /*   
               while(client.available()) {
                  Serial.write(client.read());
               }
    */
            } 
    
            delay(100);
            client.stop();   // edited
    
            //clearing string for next read
            //readString = "";
          }
        }
        delay(1);
      }
    }
    jaaa...!
    das hat jetzt zum ersten Mal gefunzt!
    Das werde ich jetzt ausgiebig testen und dann berichten!
    Tausend Dank auf jeden Fall schon einmal an euch beide!
    Geändert von HaWe (21.10.2019 um 16:16 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    JETZT hast du dein client.close() allerdings auch entfernt, was zu "socketverstopfung" führen kann.
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    HaWe
    Gast
    ach so, ich dachte, der soll auch mit weg?
    soll der auch direkt dahinter?
    Code:
           while(client.connected()) {
               while(client.available()) {
                  Serial.write(client.read());
               }
           } 
           delay(100);
           client.stop();
    - - - Aktualisiert - - -

    PS,
    habe es mal so gemacht,
    einziger "Schönheitsfehler" jetzt noch: ich muss immer 2x hintereinander auf den "Daten absenden"-Button klicken (oder ENTER-Taste), damit usrname+pwd übertragen werden, aber nach dem 2. mal klappt es jetzt (ohne client.stop() war es auch schon so).

    auch wenn ich die while-Schleife ersetze durch

    Code:
    while(client.connected()) {
              delay(10);
              /* while(client.available()) {
                  Serial.write(client.read());
               }*/
            }
    ändert sich das nicht.
    (Serial ist ja stand-allone nicht mehr verfügbar!)
    Geändert von HaWe (21.10.2019 um 12:42 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich denke:

    Du müsstest Dich entscheiden, ob die Connection zum Client bestehen bleibt oder geschlossen wird.

    WiFiClient client = wifiserver.available();

    Jetzt kannst Du mittels client mit dem Browser kommunizieren, der eine Verbindung hergestellt hat.
    Die Verbindung sollte jetzt bestehen.

    Da Du das jedesmal machst, wenn ein Datenaustausch mit dem Client statt gefunden hat, müsstest Du die Verbindung beenden, s. client.stop().

    Der Client, also der Browser soll aber wohl wissen müssen, was passieren wird. Dazu sendest Du einen Header:

    Code:
            script += ("HTTP/1.1 200 OK \n");
            script += ("Content-Type: text/html \n");
            script += ("\n");  //  do not forget this one //????

    In diesem steht aber nicht, dass die Connection geschlossen werden soll.
    Vielleicht mal mit einem korrekten Header anfangen:

    Code:
            script += ("HTTP/1.1 200 OK\r\n");
            script += ("Content-Type: text/html\r\n");
            script += ("Connection: close\r\n");
            ...



    Von vorne:


    Zuerst mit WiFiClient client = wifiserver.available(); ein Objekt holen, dass Kommunikation mit dem Browser erlaubt (Browser hat Connection hergestellt). Das kannst Du zur Not mit if(client)... überprüfen.

    Dann prüfen, ob der Browser Daten gesendet hat und diese alle einlesen und verarbeiten.

    Wenn fest steht, was er gesendet hat und die Daten (User und Passwort) richtig waren, dann die Seitendaten senden (inkl. dem Header wie oben).

    Nach dem Datentransfer dem Browser mit delay(x) etwas Zeit geben, die Daten zu empfangen.

    Dann, am Schluss, zum Schließen der Connection client.stop() verwenden.



    MfG
    Geändert von Moppi (21.10.2019 um 10:58 Uhr)

  6. #6
    HaWe
    Gast
    Zitat Zitat von Moppi Beitrag anzeigen
    Ich denke:

    Du müsstest Dich entscheiden, ob die Connection zum Client bestehen bleibt oder geschlossen wird.

    WiFiClient client = wifiserver.available();

    Jetzt kannst Du mittels client mit dem Browser kommunizieren, der eine Verbindung hergestellt hat.
    Die Verbindung sollte jetzt bestehen.

    Da Du das jedesmal machst, wenn ein Datenaustausch mit dem Client statt gefunden hat, müsstest Du die Verbindung beenden, s. client.stop().

    Der Client, also der Browser soll aber wohl wissen müssen, was passieren wird. Dazu sendest Du einen Header:

    Code:
            script += ("HTTP/1.1 200 OK \n");
            script += ("Content-Type: text/html \n");
            script += ("\n");  //  do not forget this one //????

    In diesem steht aber nicht, dass die Connection geschlossen werden soll.
    Vielleicht mal mit einem korrekten Header anfangen:

    Code:
            script += ("HTTP/1.1 200 OK\r\n");
            script += ("Content-Type: text/html\r\n");
            script += ("Connection: close\r\n");
            ...



    Von vorne:


    Zuerst mit WiFiClient client = wifiserver.available(); ein Objekt holen, dass Kommunikation mit dem Browser erlaubt (Browser hat Connection hergestellt). Das kannst Du zur Not mit if(client)... überprüfen.

    Dann prüfen, ob der Browser Daten gesendet hat und diese alle einlesen und verarbeiten.

    Wenn fest steht, was er gesendet hat und die Daten (User und Passwort) richtig waren, dann die Seitendaten senden (inkl. dem Header wie oben).

    Nach dem Datentransfer dem Browser mit delay(x) etwas Zeit geben, die Daten zu empfangen.

    Dann, am Schluss, zum Schließen der Connection client.stop() verwenden.



    MfG
    hi,
    WiFiClient client = wifiserver.available();
    habe ich ja schon ganz oben im Code stehen.

    Ich habe nun die alten 3 Codezeilen durch die 3 neuen ersetzt, allerdings baut er jetzt gar keine website mehr auf - was habe ich übersehen? (ggf: wie lautet der komplette neue Code, falls nicht nur 1 Zeile betroffen ist?)

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    ich habs mal etwas umgestellt - versuch das mal:


    Code:
    bool authorized=false;
    
    
    void handleNotAuthorized() {
      String readString = "";
      char   strinput[MAXLEN], strupwd[TOKLEN], struname[TOKLEN] ;
      
      WiFiClient client = wifiserver.available();
    
    
      if (client) {
    
    
              //---------------------------------------
              // 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);
             
                  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\r\n");
                    script += ("Content-Type: text/html\r\n");
                    script += ("Connection: close\r\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.println(script);
                    delay(100);
            
                    //stopping client
                    client.stop();
                    //clearing string for next read
                    //readString = "";
                  }
                }
                //delay(1);
              }
      }
    }

  8. #8
    HaWe
    Gast
    KORREKTUR !!

    update:

    ich hatte noch das alte
    Code:
            while(client.connected()) { 
              delay(10);    
            }
    vor dem client.close() mit drin, aber nun rausgelöscht....:


    UND JETZT schaltet er korrekt nach dem 1. Enter/Button Click durch!

    4x nachgetestet, nach Neustart und zwischen-Abort, immer ok!

    Ich verneige mich - und werde es jetzt noch über ein paar Stunden weiter testen+beobachten!

    Tausend Dank!

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Hä?

    Verstehe ich nicht. Wo hattest Du client.close() drinnen?
    Wie sieht der Code jetzt aus, wo es funktioniert?


    MfG

Ähnliche Themen

  1. arduino ide mit esp8266
    Von NotEvil im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 4
    Letzter Beitrag: 12.01.2017, 14: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, 20: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, 08:02
  4. Funktion wird nicht richtig beendet
    Von kowolfgang im Forum C - Programmierung (GCC u.a.)
    Antworten: 16
    Letzter Beitrag: 31.12.2008, 16:37
  5. schieberegister neuer versuch...
    Von Bluesmash im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 12
    Letzter Beitrag: 11.07.2005, 21:10

Berechtigungen

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

LiFePO4 Speicher Test