Hä?
Verstehe ich nicht. Wo hattest Du client.close() drinnen?
Wie sieht der Code jetzt aus, wo es funktioniert?
MfG
KORREKTUR !!
update:
ich hatte noch das alte
vor dem client.close() mit drin, aber nun rausgelöscht....:Code:while(client.connected()) { delay(10); }
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!![]()
Hä?
Verstehe ich nicht. Wo hattest Du client.close() drinnen?
Wie sieht der Code jetzt aus, wo es funktioniert?
MfG
äh, sorry, vor
// close the connection:
client.stop();
der "echte" ungekürzte Code ist dieser hier:
Code:void handleNotAuthorized() { String readString = ""; char strinput[MAXLEN], strupwd[TOKLEN], struname[TOKLEN] ; WiFiClient client = wifiserver.available(); 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(); } if(strstr(website_upwd,strupwd)!=NULL & strstr(website_uname,struname)!=NULL) 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("<<<"); Serial.print("readString>>>");Serial.println(readString); if ( (strlen(strupwd)==strlen(website_upwd)) && (strcmp(website_upwd, strupwd)==0) && (strlen(struname)==strlen(website_uname)) && (strcmp(website_uname, struname)==0) ) { authorized = true; readString = ""; return; } //if HTTP request has ended if (c == '\n') { client.flush(); //now output html data header String script=""; 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"); //---------------------------------- String script1 = ""; script1 += "HTTP/1.1 200 OK \n"; script1 += "Content-Type: text/html \n"; script1 += "Content-Length: " + (String)script.length() + "\n"; script1 += "\n"; // do not forget this one //???? script = script1+script; client.print(script); delay(100); //stopping client /* while(client.connected()) { delay(10); } */ client.stop(); } } delay(1); } }
Warum so: (String)script.length()
bei mir funktionierte das auch ohne das "(String)"
???
PS: gib mal: "(String)" bei google ein, mit Gänsefüßchen oder ohne!![]()
![]()
bei mir ging es zunächst nicht, aber es stört jetzt auch nicht weiter![]()
Soll das (String) extra in String konvertieren?
ja, genau, habe es noch mal getestet und dann kommt ohne (String):
was ja eigentlich verständlich ist, denn lenghth() ist ja eine Zahl, die man nicht an cstrings addieren kann.ESP8266_ServerHomeWebMail_078:1273:59: error: invalid operands of types 'const char*' and 'const char [2]' to binary 'operator+'
script1 += "Content-Length: " + script.length() + "\n";
Ok. Gut! Danke! Hatte so etwas ähnliches im Hinterkopf. Nur es gibt Funktionen, wo man es nicht extra konvertieren muss. Hätte auch mit String(script.length(), DEZ) oder schlicht mit String(script.length()) funktioniert?
Jetzt können wir jedenfalls 2.5.2 weiter verwenden.
ja, String(...) funktioniert auch als Funktion, (String) ist ein explizites typecasting.
Und ja, ich freue mich auch sehr, dass jetzt de 2.5.2 funktioniert!
Nochmals vielen Dank für die erfolgreiche Mitarbeit und Hilfe!
Geändert von HaWe (25.10.2019 um 19:16 Uhr)
PS,
ein Randproblem: wie lösen eigentlich Arduinorianer das Extrahieren des eingegeben Strings?
das ist zwar etwas, das ich gelöst habe mit eigenen Funktionen, aber ich kann mir ehrlich gessagt nicht vorstellen, dass es da bei Arduino noch keine fertige Funktion gibt...?
Code://---------------------------------------------------------------------------- // String functions //---------------------------------------------------------------------------- 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; const char* kini = "&"; // start of varname: '&' const char* kin2 = "?"; // start of varname: '?' const char* kequ = "="; // end of varname, start of argument: '=' char needle[TOKLEN] = ""; // complete pattern: &varname=abc1234 strcpy(sarg,""); strcpy(needle, kini); strcat(needle, vname); strcat(needle, kequ); pos = strstrpos(haystack, needle); if(pos==-1) { needle[0]=kin2[0]; 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==' \n')||(ch=='\r') ||(ch=='\0') ||(i+pos>=strlen(haystack))||(i>TOKLEN-1) ) { sarg[i]='\0'; return sarg; } if( (ch!='&') ) { sarg[i]=ch; i++; } } return sarg; } // *SNIP* cstringarg(strinput, "uname", struname); // uname cstringarg(strinput, "upwd", strupwd); // upwd if ( (strlen(strupwd)==strlen(website_upwd)) && (strcmp(website_upwd, strupwd)==0) && (strlen(struname)==strlen(website_uname)) && (strcmp(website_uname, struname)==0) ) { //... }
Geändert von HaWe (25.10.2019 um 19:17 Uhr)
Lesezeichen