JETZT hast du dein client.close() allerdings auch entfernt, was zu "socketverstopfung" führen kann.
jaaa...!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); } }
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 17:16 Uhr)
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.
ach so, ich dachte, der soll auch mit weg?
soll der auch direkt dahinter?
- - - Aktualisiert - - -Code:while(client.connected()) { while(client.available()) { Serial.write(client.read()); } } delay(100); client.stop();
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
ändert sich das nicht.Code:while(client.connected()) { delay(10); /* while(client.available()) { Serial.write(client.read()); }*/ }
(Serial ist ja stand-allone nicht mehr verfügbar!)
Geändert von HaWe (21.10.2019 um 13:42 Uhr)
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 11:58 Uhr)
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?)
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); } } }
leider springt er jetzt sofort wieder raus, wie ganz am Anfang,
und wenn ich einsetze vor client.stop();
dann baut er sie auf, beibt aber ewig drin hängen, auch nach korrektem login+pwdCode://stopping client while(client.connected()) { delay(10); } client.stop();
strupwd und struname werden doch überhaupt nicht aus dem gelesenen String readString extrahiert, aber anschließend verglichen und dann davon abhängig gemacht, ob authorized = true;
Das haut irgendwie hinten und vorne noch nicht hin.
dieser Teil mit der Extrahierung von strupwd und struname ist hier nur verkürzt wiedergegeben, um die Lesbarkeit zu erhöhen, meine eigene Methode ist recht kompliziert.
Wie würdest DU diese Extrahierung samt Vergleich machen, und, wo wir gerade dabei sind, ggf. mit POST anstelle von GET?
Vieleicht liegt ja tatsächlich hier der Hase im Pfeffer...?
ich habs nochmals geändert und ein Schnipsel eingefügt:
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 while ( c != '\n') { c = client.read(); } 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); } } }
entscheidend ist, dass die Seite jedesmal angezeigt wird, wenn der Browser eine Anfrage an den Server stellt. Denn erst dann kann man das Passwort eingeben und den Namen, was dann ausgewertet werden muss.
Ob das Passwort stimmt oder ob der Vergleich dazu hinhaut wissen wir nicht, weil der Teil fehlt. Man kann das umschreiben, ich habe aber nicht die Möglichkeit, das mit 2.5.x zu probieren - glaub ich.
Muss mal sehen. Das kann so schwer nicht sein.
Lesezeichen