Zitat von
Moppi
Grundsätzlich ist das ja auch nicht das Problem, sondern die Arduino-mäßige Umsetzung. Aber ich mache es gerne mal konkret: Was ist an diesem Code fehlerhaft, dass er nicht mit ESP8266 cores 4.4.1 und 4.4.2 läuft sondern nur mit cores 4.3.0 und 4.4.0?
Code:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
WiFiServer wifiserver(http_port);
const int MAXLEN = 1024;
const int TOKLEN = 64;
char website_uname[20]; // website user name log in "MyWebsiteLoginName"
char website_upwd[20]; // website user pwd log in "MyWebsiteLoginPwd"
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;
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
if ( strlen(strupwd) == strlen(website_upwd)
&& strncmp(strupwd, website_upwd, strlen(website_upwd) ) == 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.print(c);
}
//if HTTP request has ended
if (c == '\n') {
client.flush();
Serial.println(readString);
//now output html data header
String script = "";
script += ("HTTP/1.1 401 Log-In Required");
script += ("Content-Type: text/html \n");
script += ("\n");
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)": <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);
}
}
Bei den beiden neueren Cores springt er zur Laufzeit sofort aus dieser Funktion heraus und bricht ab mit der Meldung "Die Website ist nicht verfügbar", und dann kann man sich auch nicht erneut einloggen oder die Standard-Website aufrufen.
Ansonsten wird bei den älteren Cores bei korrektem Login auch anschließend die Standard-Seite korrekt geladen.
Setzt man authorized dagegen vorher manuell auf true, wird bei jedem Core, neu wie alt, auch sofort die Standardseite korrekt erzeugt.
oder sind es evt bugs in den esp-cores selber?
Lesezeichen