Hallo en welkom
naar een nieuw onderdeel van de ESP Captive portal-serie. In vandaag Blog we breiden onze captive portal uit met een eerste applicatie: als bestandsserver! Bestanden tot een maximale interne SPIFFS-grootte kunnen worden geüpload via de webportal, maar kunnen ook opnieuw worden gedownload. Om deze functie gemakkelijk te bedienen, bouwen we ons hoofdmenu nog eenen (sub) punt van: We voegen het punt "Filemanger" toe als een link in de systeemkoppelingen en bouwen een subpagina met de belangrijkste bestandsfuncties die zo'n bestandsserver nodig heeft. De hoofdpagina van onze bestandsserver ziet er dan als volgt uit:
We zien het nieuwe punt "Filemanager". Onder dit punt bouwen we nu een nieuwe website die alle belangrijke punten voor bestandsbeheer bevat:
Voordat we het SPIFFS-bestandssysteem via onze webserver kunnen gebruiken om ons eerste bestand op te slaan, moeten we het formatteren. Er is ook de link "Format SPIFFS Filesystem", die, na te hebben geklikt, het SPIFFS-bestandssysteem voor het eerste gebruik opmaakt. We klikken er dus eerst op en wachten tot het bestandssysteem intern is geformatteerd. Het eerste bestand kan vervolgens worden opgeslagen. We gebruiken de bovenstaande knoppen om bestanden op te slaan / te maken.
Enerzijds zou dit een knop zijn waarmee een bestand van de lokale harde schijf kan worden geselecteerd en ook een knop waarmee dit geselecteerde bestand vervolgens kan worden geüpload naar onze ESP.
Dit bestand verschijnt vervolgens na een automatische herlaadbeurt van de pagina in het bovenste gedeelte onder "Beschikbare bestanden op SPIFFS". Daar kan het opnieuw worden gedownload, maar kan ook worden verwijderd als het niet langer nodig is. Er is niets meer nodig voor een bestandsopslagsysteem. Het geheugen is voldoende voor verschillende kleine bestanden of afbeeldingen.
De code voor de captive portal voor de ESP32, aangevuld met de functionaliteit van de bestandsserver, is:
[
# opnemen <WiFi.h> # opnemen <WiFiClient.h> # opnemen <Webserver.h> # opnemen <ESPmDNS.h> # opnemen <SPIFFS.h> # opnemen <DNS-server.h> # opnemen <EEPROM.h> #define GPIO_OUT_W1TS_REG (DR_REG_GPIO_BASE + 0x0008) #define GPIO_OUT_W1TC_REG (DR_REG_GPIO_BASE + 0x000c) statisch const byte WiFiPwdLen = 25; statisch const byte APSTANAMELEN = 20; struct WiFiEEPromData { dwaas APSTA = waar; // Toegangspunt of stationmodus - echte AP-modus dwaas PwDReq = fout; // Wachtwoord vereist dwaas CapPortal = waar ; // CaptivePortal aan in AP-modus char APSTAName[APSTANAMELEN]; // STATION / AP Punt Naam TE VERBINDEN, indien definded char WiFiPwd[WiFiPwdLen]; // WiFiPAssword, indien verdedigd char ConfigValid[3]; // Als Config Vaild is, is tag "TK" vereist " }; / * hostnaam voor mDNS. Moet op zijn minst werken op Windows. Probeer het maar http://esp8266.local */ const char *ESPHostname = "ESP32"; // DNS-server const byte DNS_PORT = 53; DNS-server dnsServer; // Conmmon Paramenters dwaas SoftAccOK = fout; // webserver Webserver server(80); / * Soft AP-netwerkparameters * / IP-adres apIP(172, 20, 0, 1); IP-adres netMsk(255, 255, 255, 0); niet ondertekend lang huidige Millis = 0; niet ondertekend lang start Millis; / ** Huidige WLAN-status * / kort status = WL_IDLE_STATUS; Bestand fsUploadFile; // een File-object om het ontvangen bestand tijdelijk op te slaan WiFiEEPromData MyWiFiConfig; String getContentType(String bestandsnaam); // converteer de bestandsextensie naar het MIME-type dwaas handleFileRead(String pad); // stuur het juiste bestand naar de client (als het bestaat) nietig handleFileUpload(); // upload een nieuw bestand naar de SPIFFS String temp =""; nietig instellen() { REG_WRITE(GPIO_OUT_W1TS_REG, BIT(GPIO_NUM_16)); // Guru Meditation Error Remediation set vertraging(1); REG_WRITE(GPIO_OUT_W1TC_REG, BEETJE(GPIO_NUM_16)); // Guru Meditation Error Remediation clear dwaas ConnectSuccess = fout; dwaas CreateSoftAPSucc = fout; dwaas CInitFSSystem = fout; dwaas CInitHTTPServer = fout; byte len; Serie.beginnen(9600); terwijl (!Serie) { ; // wacht tot seriële poort verbinding maakt. Nodig voor native USB } Serie.println(F("Seriële interface geïnitialiseerd op 9600 Baud.")); Wifi.setAutoReconnect (fout); Wifi.aanhoudend(fout); Wifi.verbinding verbreken(); Wifi.setHostname(ESPHostname); // Stel de DHCP-hostnaam in die is toegewezen aan ESP-station. als (loadCredentials()) // Laad WLAN-inloggegevens voor WiFi-instellingen { Serie.println(F("Geldige referenties gevonden.")); als (MyWiFiConfig.APSTA == waar) // AP-modus { Serie.println(F("Toegangspuntmodus geselecteerd.")); len = strlen(MyWiFiConfig.APSTAName); MyWiFiConfig.APSTAName[len+1] = '\0'; len = strlen(MyWiFiConfig.WiFiPwd); MyWiFiConfig.WiFiPwd[len+1] = '\0'; CreateSoftAPSucc = CreateWifiSoftAP(); } anders { Serie.println(F("Station Mode geselecteerd.")); len = strlen(MyWiFiConfig.APSTAName); MyWiFiConfig.APSTAName[len+1] = '\0'; len = strlen(MyWiFiConfig.WiFiPwd); MyWiFiConfig.WiFiPwd[len+1] = '\0'; len = ConnectWifiAP(); als ( len == 3 ) { ConnectSuccess = waar; } anders { ConnectSuccess = fout; } } } anders { // Set default Config - AP maken Serie.println(F("GEEN geldige referenties gevonden.")); SetDefaultWiFiConfig (); CreateSoftAPSucc = CreateWifiSoftAP(); saveCredentials(); vertraging(500); } // Bestandssysteem initialiseren CInitFSSystem = InitalizeFileSystem(); als (!(CInitFSSystem)) {Serie.println(F("Bestandssysteem niet geïnitialiseerd!")); } als ((ConnectSuccess of CreateSoftAPSucc)) { Serie.afdrukken (F("IP adres: ")); als (CreateSoftAPSucc) { Serie.println(Wifi.softAPIP());} als (ConnectSuccess) { Serie.println(Wifi.localIP());} InitialiseerHTTPServer(); } anders { Serie.setDebugOutput(waar); // Foutopsporingsoutput voor WLAN op seriële interface. Serie.println(F("Fout: kan geen verbinding maken met WLAN. Stel DEFAULT-configuratie in.")); SetDefaultWiFiConfig(); CreateSoftAPSucc = CreateWifiSoftAP(); InitialiseerHTTPServer(); SetDefaultWiFiConfig(); saveCredentials(); } } nietig InitialiseerHTTPServer() { dwaas initok = fout; / * Webpagina's instellen: root, wifi-configuratiepagina's, SO captive portal detectors en niet gevonden. * / server.Aan("/", handleRoot); server.Aan("/Wifi", handvatWifi); server.Aan("/bestandssysteem", HTTP_GET,handleDisplayFS); server.Aan("/uploaden", HTTP_POST, []() { server.sturen(200, "text / plain", ""); }, handleFileUpload); // if (MyWiFiConfig.CapPortal) {server.on ("/ genereren_204", handleRoot); } // Android-captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. // if (MyWiFiConfig.CapPortal) {server.on ("/ favicon.ico", handleRoot); } // Nog een Android-captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. Gecontroleerd op Sony Handy // if (MyWiFiConfig.CapPortal) {server.on ("/ fwlink", handleRoot); } // Microsoft captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. server.Aan("/ genereren_204", handleRoot); // Android captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. server.Aan("/favicon.ico", handleRoot); // Nog een Android-captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. Gecontroleerd op Sony Handy server.Aan("/ fwlink", handleRoot); // Microsoft captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. server.onNotFound ( handleNotFound ); // Speicherung Header-Element anfordern // server.collectHeaders (Headers, sizeof (Headers) / sizeof (Headers [0])); server.beginnen(); // Webserver start } Boolean InitalizeFileSystem() { dwaas initok = fout; initok = SPIFFS.beginnen(); vertraging(200); als (!(initok)) { Serie.println(F("SPIFFS formatteren")); SPIFFS.formaat(); initok = SPIFFS.beginnen(); } terug initok; } Boolean CreateWifiSoftAP() { Wifi.verbinding verbreken(); Serie.afdrukken(F("SoftAP initialiseren")); als (MyWiFiConfig.PwDReq) { SoftAccOK = Wifi.softAP(MyWiFiConfig.APSTAName, MyWiFiConfig.WiFiPwd); // Passwortlänge mindestens 8 Zeichen! } anders { SoftAccOK = Wifi.softAP(MyWiFiConfig.APSTAName); // Toegangspunt ZONDER wachtwoord // Overbelastingsfunctie :; WiFi.softAP (ssid, wachtwoord, kanaal, verborgen) } vertraging(2000); // Zonder vertraging heb ik het IP-adres leeg gezien Wifi.softAPConfig(apIP, apIP, netMsk); als (SoftAccOK) { / * Stel de DNS-server in die alle domeinen omleidt naar de apIP * / DNS server.setErrorReplyCode(DNSReplyCode::Geen fout); DNS server.begin(DNS_PORT, "*", apIP); Serie.println(F("succesvol.")); // Serial.setDebugOutput (true); // Foutopsporingsoutput voor WLAN op seriële interface. } anders { Serie.println(F("Soft AP-fout.")); Serie.println(MyWiFiConfig.APSTAName); Serie.println(MyWiFiConfig.WiFiPwd); } terug SoftAccOK; } byte ConnectWifiAP() { Serie.println(F("Initalizing Wifi Client.")); byte connRes = 0; byte ik = 0; Wifi.verbinding verbreken(); Wifi.softAPdisconnect(waar); // Functie stelt momenteel geconfigureerde SSID en wachtwoord van de soft-AP in op nulwaarden. De parameter is optioneel. Indien ingesteld op true, wordt de soft-AP-modus uitgeschakeld. vertraging(500); Wifi.beginnen(MyWiFiConfig.APSTAName, MyWiFiConfig.WiFiPwd); connRes = Wifi.waitForConnectResult(); terwijl (( connRes == 0 ) en (ik != 10)) // if connRes == 0 "IDLE_STATUS - Statius wijzigen" { connRes = Wifi.waitForConnectResult(); vertraging(2000); ik++; Serie.afdrukken(F(".")); // verklaring (en) } terwijl (( connRes == 1 ) en (ik != 10)) // if connRes == 1 NO_SSID_AVAILin - SSID kan niet worden bereikt { connRes = Wifi.waitForConnectResult(); vertraging(2000); ik++; Serie.afdrukken(F(".")); // verklaring (en) } als (connRes == 3 ) { Wifi.setAutoReconnect(waar); // Stel in of de module probeert opnieuw verbinding te maken met een toegangspunt in het geval dat de verbinding wordt verbroken. // MDNS-responder instellen als (!MDNS.beginnen(ESPHostname)) { Serie.println(F("Fout: MDNS")); } anders { MDNS.addService("http", "tcp", 80); } } terwijl (( connRes == 4 ) en (ik != 10)) // if connRes == 4 Ongeldig wachtwoord. Soms gebeurt dit met corrct PWD { Wifi.beginnen(MyWiFiConfig.APSTAName, MyWiFiConfig.WiFiPwd); connRes = Wifi.waitForConnectResult(); vertraging(3000); ik++; Serie.afdrukken(F(".")); } als (connRes == 4 ) { Serie.println(F("STA Pwd Err")); Serie.println(MyWiFiConfig.APSTAName); Serie.println(MyWiFiConfig.WiFiPwd); Wifi.verbinding verbreken(); } // if (connRes == 6) {Serial.println ("DISCONNECTED - Niet in stationmodus"); } // WiFi.printDiag (serieel); Serie.println(""); terug connRes; } #bepalen SD_BUFFER_PIXELS 20 nietig handleFileUpload() { // Dateien vom Rechnenknecht oder Klingelkasten ins SPIFFS schreiben als (server.uri() != "/uploaden") terug; HTTPUpload& uploaden = server.uploaden(); als (uploaden.toestand == UPLOAD_FILE_START) { Draad bestandsnaam = uploaden.bestandsnaam; als (uploaden.bestandsnaam.lengte() > 30) { uploaden.bestandsnaam = uploaden.bestandsnaam.substring(uploaden.bestandsnaam.lengte() - 30, uploaden.bestandsnaam.lengte()); // Dateinamen auf 30 Zeichen kürzen } Serie.println("FileUpload-naam:" + uploaden.bestandsnaam); als (!bestandsnaam.begint met("/")) bestandsnaam = "/" + bestandsnaam; // fsUploadFile = SPIFFS.open (bestandsnaam, "w"); fsUploadFile = SPIFFS.Open("/" + server.urlDecode(uploaden.bestandsnaam), "w"); bestandsnaam = Draad(); } anders als (uploaden.toestand == UPLOAD_FILE_WRITE) { // Serial.print ("handleFileUpload Data:"); Serial.println (upload.currentSize); als (fsUploadFile) fsUploadFile.schrijven(uploaden.buf, uploaden.Huidige grootte); } anders als (uploaden.toestand == UPLOAD_FILE_END) { als (fsUploadFile) fsUploadFile.dichtbij(); // Serial.print ("handleFileUpload Size:"); Serial.println (upload.totalSize); server.sendContent(Koptekst); handleDisplayFS(); } } Void handleDisplayFS() { HTML-bestandssysteem Pagina: /filesystem Temp =""; HTML-koptekst Server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader("Pragma", "no-cache"); Server.sendHeader("Verloopt", "-1"); Server.setContentLength(CONTENT_LENGTH_UNKNOWN); HTML-inhoud Server.Verzenden ( 200, "tekst/html", Temp ); Temp += "<! DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name= viewport content='width=device-width, initial-scale=1.0,'>"; Server.sendContent(Temp); Temp = ""; Temp += "<style type='text/css'><!-- DIV.container { min-hoogte: 10em; weergeven: tabelcel; verticaal uitlijnen: middelste }.button {hoogte:35px; breedte:90px; tekengrootte:16px}"; Server.sendContent(Temp); Temp = ""; Temp += "lichaam {achtergrond-kleur: powderblue;} </style><head><title>File System Manager</title></head>"; Temp += "<h2>Serial Peripheral Interface Flash Filesystem</h2><body><left>"; Server.sendContent(Temp); Temp = ""; Als (Server.Args() > 0) Parameter wurden ubergeben { Als (Server.hasArg hasArg("verwijderen")) { Tekenreeks Ftodel Ftodel = Server.Arg("verwijderen"); Als (SPIFFS (SPIFFS).Bestaat(Ftodel Ftodel)) { SPIFFS (SPIFFS).Verwijderen(Ftodel Ftodel); Temp += "Bestand" + Ftodel Ftodel + " met succes verwijderd."; } Anders { Temp += "Bestand" + Ftodel Ftodel + " kan niet worden verwijderd."; } Server.sendContent(Temp); Temp = ""; } Als (Server.hasArg hasArg("formaat") En Server.Arg("op")) { SPIFFS (SPIFFS).Formaat(); Temp += "SPI-bestandssysteem is geformatteerd."; Server.sendContent(Temp); Temp = ""; } server.client().stop(;); Stop is nodig omdat we geen inhoudslengte hebben verzonden } Temp += "<table border=2 bgcolor = witte breedte = 400 ><td><h4>Huidige SPIFFS-status: </h4>"; Temp += formatBytes(SPIFFS (SPIFFS).gebruikteBytes() * 1.05) + " van " + formatBytes(SPIFFS (SPIFFS).totalBytes()) + " gebruikt. <br>"; Temp += formatBytes((SPIFFS (SPIFFS).totalBytes() - (SPIFFS (SPIFFS).gebruikteBytes() * 1.05)))+ " gratis. <br>"; Temp += "</td></table><br>"; Server.sendContent(Temp); Temp = ""; Controleren op siteparameters Temp += "<table border=2 bgcolor = witte breedte = 400><tr><th><br>"; Temp += "<h4>Beschikbare bestanden op SPIFFS:</h4><tafelrand=2 bgcolor = wit ></tr></th><td>Bestand name</td><td>Size</td><td>Action </td></tr></th>"; Server.sendContent(Temp); Temp = ""; Bestand Root = SPIFFS (SPIFFS).Open("/"); Bestand Bestand = Root.openNextFile(); Terwijl (Bestand) { Temp += "<td> <a title=\"Download\" href =\"" + Tekenreeks(Bestand.Naam()) + "\" download=\"" + Tekenreeks(Bestand.Naam()) + "\">" + Tekenreeks(Bestand.Naam()) + "</a> <br></th>"; Temp += "<td>"+ formatBytes(Bestand.Grootte())+ "</td>"; Temp += "<td><a href =filesystem?delete=" + Tekenreeks(Bestand.Naam()) + "> Verwijderen </a></td>"; Temp += "</tr></th>"; Bestand = Root.openNextFile(); } Temp += "</tr></th>"; Temp += "</td></tr></th><br></th></tr></table></table><br>"; Temp += "<table border=2 bgcolor = witte breedte = 400 ><td><h4>Upload</h4>"; Temp += "<label> Bestand kiezen: </label>"; Temp += "<form method='POST' action='/upload' enctype='multipart/form-data' style='height:35px;' ><input type='file' name='upload' style='height:35px; lettertypegrootte:13px;' vereist>\r\n<invoertype='Submit' value='Upload' class='button'></form>"; Temp += " </table><br>"; Server.sendContent(Temp); Temp = ""; Temp += "<td><a href =filesystem?format=on> Format SPIFFS Filesystem. (Duurt maximaal 30 seconden) </a></td>"; Temp += "<table border=2 bgcolor = white width = 500 cellpadding =5 ><caption>><p><h3>Systemlinks:</h2></p></caption><<tr><th><br>"; Temp += " <a href='/>Hoofdpagina</a><br><br></th></tr></table><br><br>"; Server.sendContent(Temp); Temp = ""; Temp += "<footer><p>Programmed and designed by: Tobias Kuch</p><p>Contact informatie: <a href='mailto:tobias.kuch@googlemail.com'>tobias.kuch@googlemail.com</a>;</p></footer></body><; server.send ( 200, "", temp ); Server.sendContent(Temp); Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden Temp = ""; } /** WLAN-referenties laden van EEPROM */ Bool loadCredentials() { Bool RetValue; Eeprom.Beginnen(512); Eeprom.Toevoegen(0, MyWiFiConfig MyWiFiConfig); Eeprom.Einde(); Als (Tekenreeks(MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)) = Tekenreeks("TK")) { RetValue = Waar; } Anders { RetValue = Valse; WLAN-instellingen zijn niet gevonden. } Terug RetValue; } /** Wlan-referenties opslaan bij EEPROM */ Bool referenties opslaan() { Bool RetValue; Logische fouten controleren RetValue = Waar; Als (MyWiFiConfig MyWiFiConfig.APSTA APSTA == Waar ) AP-modus { Als (MyWiFiConfig MyWiFiConfig.PwDReq PwDReq En (grootte van(Tekenreeks(MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd)) < 8)) { RetValue = Valse; Ongeldige Config } Als (grootte van(Tekenreeks(MyWiFiConfig MyWiFiConfig.APSTAName)) < 1) { RetValue = Valse; Ongeldige Config } } Als (RetValue) { Eeprom.Beginnen(512); Voor (Int I = 0 ; I < grootte van(MyWiFiConfig MyWiFiConfig) ; I++) { Eeprom.Schrijven(I, 0); } strncpy strncpy( MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid) , "TK", grootte van(MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)) ); Eeprom.zet(0, MyWiFiConfig MyWiFiConfig); Eeprom.Commit(); Eeprom.Einde(); } Terug RetValue; } Void SetDefaultWiFiConfig() { Byte Len; MyWiFiConfig MyWiFiConfig.APSTA APSTA = Waar; MyWiFiConfig MyWiFiConfig.PwDReq PwDReq = Waar; standaard PW vereist MyWiFiConfig MyWiFiConfig.CapPortal CapPortal = Waar; strncpy strncpy( MyWiFiConfig MyWiFiConfig.APSTAName, "ESP_Config", grootte van(MyWiFiConfig MyWiFiConfig.APSTAName) ); Len = strlen strlen(MyWiFiConfig MyWiFiConfig.APSTAName); MyWiFiConfig MyWiFiConfig.APSTAName[Len+1] = '\0'; strncpy strncpy( MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd, "12345678", grootte van(MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd) ); Len = strlen strlen(MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd); MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[Len+1] = '\0'; strncpy strncpy( MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid), "TK", grootte van(MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)) ); Len = strlen strlen(MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)); MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)[Len+1] = '\0'; Seriële.println(F('WiFi-referenties opnieuw instellen'.)); } Void handleRoot() { Hoofdpagina: Temp = ""; Byte PicCount (PicCount) = 0; Byte ServArgs ServArgs ServArgs = 0; HTML-koptekst Server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader("Pragma", "no-cache"); Server.sendHeader("Verloopt", "-1"); Server.setContentLength(CONTENT_LENGTH_UNKNOWN); HTML-inhoud Server.Verzenden ( 200, "tekst/html", Temp ); Speichersparen - Schon mal dem Cleint senden Temp = ""; Temp += "<! DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name= viewport content='width=device-width, initial-scale=1.0,'>"; Server.sendContent(Temp); Temp = ""; Temp += "<style type='text/css'><!-- DIV.container { min-hoogte: 10em; weergeven: tabelcel; verticaal uitlijnen: middelste }.button {hoogte:35px; breedte:90px; tekengrootte:16px}"; Server.sendContent(Temp); Temp = ""; Temp += "lichaam {achtergrond-kleur: powderblue;} </stijl>"; Temp += "<head><title>Hauptseite</title><head>"; Temp += "<h2>Hauptseite</h2>"; Temp += "<body>"; Server.sendContent(Temp); Temp = ""; Gebruikersverzoek verwerken Temp = ""; Temp += "<table border=2 bgcolor = white width = 500 cellpadding =5 ><caption><p><h3>Systemlinks:</h2></p></caption>"; Temp += "<tr><th><br>"; Temp += "<a href="/nl/wifi">WIFI Einstellungen</a><br><br>"; Temp += "<a href="/nl/filesystem">Filemanager</a><br><br>br>"; Temp += "</th></tr></table><br><br>"; Temp += "<footer><p>Geprogrammeerd en ontworpen door: Tobias Kuch</p><p>Contactgegevens: <a href='mailto:tobias.kuch@googlemail.com'>tobias.kuch@googlemail.com</a></p></footer>"; Temp += "</body></html>"; Server.sendContent(Temp); Temp = ""; Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden } Void handleNotFound() { Als (captivePortal()) { Als caprive portal redirect in plaats van het weergeven van de fout pagina. Terug; } Als (!handleFileRead(Server.Uri())) { Temp = ""; HTML-koptekst Server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader("Pragma", "no-cache"); Server.sendHeader("Verloopt", "-1"); Server.setContentLength(CONTENT_LENGTH_UNKNOWN); HTML-inhoud Temp += "<! DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name= viewport content='width=device-width, initial-scale=1.0,'>"; Temp += "<style type='text/css'><!-- DIV.container { min-hoogte: 10em; weergeven: tabelcel; verticaal uitlijnen: middelste }.button {hoogte:35px; breedte:90px; tekengrootte:16px}"; Temp += "lichaam {achtergrond-kleur: powderblue;} </stijl>"; Temp += "<head><title>Bestand niet gevonden</title></head>"; Temp += "<h2> 404 File Not Found</h2><br>"; Temp += "<h4>Foutopsporingsinformatie:<h4><br>"; Temp += "<body>"; Temp += "URI: "; Temp += Server.Uri(); Temp += "\nMethode: "; Temp+= ( Server.Methode() == HTTP_GET ) ? "GET" : "POST"; Temp += "<br>Argumenten: "; Temp += Server.Args(); Temp += "\n"; Voor ( uint8_t I = 0; I < Server.Args(); I++ ) { Temp += " " + Server.argName ( I ) + ": " + Server.Arg ( I ) + "\n"; } Temp += "<br>Server Hostheader: "+ Server.hostHeader(); Voor ( uint8_t I = 0; I < Server.Headers(); I++ ) { Temp += " " + Server.headerName ( I ) + ": " + Server.Header ( I ) + "\n<br>"; } Temp += </table></form><<br><br><table border=2 bgcolor = white width = 500 cellpadding =5 ><caption><p><<h2>U bladeren naar:</h2></p;</caption>; Temp += "<tr><th>"; Temp += "<a href="/nl">Hoofdpagina</a><br>"; Temp += "<a href="/nl/wifi">WIFI Settings</a><br>"; Temp += "<a href="/nl/filesystem">Filemanager</a><br>"; Temp += "</th></tr></table><br><br>"; Temp += "<footer><p>Geprogrammeerd en ontworpen door: Tobias Kuch</p><p>Contactgegevens: <a href='mailto:tobias.kuch@googlemail.com'>tobias.kuch@googlemail.com</a></p></footer>"; Temp += "</body></html>"; Server.Verzenden ( 404, "", Temp ); Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden Temp = ""; } } /** Omleiden naar captive portal als we een verzoek voor een ander domein kregen. Retourtrue in dat geval, zodat de paginahandler het verzoek niet opnieuw probeert te verwerken. */ Booleaanse captivePortal() { Als (!Isip(Server.hostHeader()) && Server.hostHeader() != (Tekenreeks(ESPHostname)+".lokaal")) { Serial.println("Verzoek doorgestuurd naar captive portal"; Server.sendHeader("Locatie", Tekenreeks("http://") + toStringIp(Server.Client().localIP()), Waar); Server.Verzenden ( 302, "tekst/vlakte", ""); Lege inhoud remt Content-length header, dus we moeten de socket zelf sluiten. Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden Terug Waar; } Terug Valse; } /** Wifi config pagina handler */ Void handleWifi() { Pagina: /wifi Byte I; Byte Len ; Temp = ""; Controleren op siteparameters Als (Server.hasArg hasArg("Reboot") ) Opnieuw opstarten van systeem { Temp = "Rebooting System in 5 Seconds.."; Server.Verzenden ( 200, "tekst/html", Temp ); Vertraging(5000); Server.Client().Stoppen(); Wifi.Verbreken(); Vertraging(1000); } Als (Server.hasArg hasArg("WiFiMode") En (Server.Arg("WiFiMode") == "1") ) STA Station Mode Maak verbinding met een ander WIFI-station { startMillis = millis(); Reset Time Up Counter om te voorkomen dat idle mode whiole werken Verbinding maken met bestaand station Als ( grootte van(Server.Arg("WiFi_Network")) > 0 ) { Seriële.println("STA-modus"); MyWiFiConfig MyWiFiConfig.APSTA APSTA = Valse; Access Point of Station Mode - valse stationsmodus Temp = ""; Voor ( I = 0; I < APSTANamelen APSTANameLen;I++) { MyWiFiConfig MyWiFiConfig.APSTAName[I] = 0; } Temp = Server.Arg("WiFi_Network"); Len = Temp.Lengte(); Voor ( I = 0; I < Len;I++) { MyWiFiConfig MyWiFiConfig.APSTAName[I] = Temp[I]; } Temp = ""; Voor ( I = 0; I < WiFiPwdLen WiFiPwdLen;I++) { MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[I] = 0; } Temp = Server.Arg("STAWLANPW"); Len = Temp.Lengte(); Voor ( I = 0; I < Len;I++) { Als (Temp[I] > 32) Steuerzeichen raus { MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[I] = Temp[I]; } } Temp = "WiFi Verbinding maken met AP: -"; Temp += MyWiFiConfig MyWiFiConfig.APSTAName; Temp += "-<br>WiFi PW: -"; Temp += MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd; Temp += "-<br>"; Temp += "Verbinding maken met de STA-modus in 2 seconden.. <br>"; Server.Verzenden ( 200, "tekst/html", Temp ); Server.sendContent(Temp); Vertraging(2000); Server.Client().Stoppen(); Server.Stoppen(); Temp = ""; Wifi.Verbreken(); Wifi.softAPdisconnect(Waar); Vertraging(500); ConnectWifiAP Bool SaveOk = referenties opslaan(); I = ConnectWifiAP(); Vertraging(700); Als (I != 3) 4: WL_CONNECT_FAILED - Wachtwoord is onjuist 1: WL_NO_SSID_AVAILin - Geconfigureerde SSID is niet bereikbaar { Seriële.Afdrukken(F("Kan geen verbinding maken met gespecificeerd netwerk. Reden: ")); Seriële.println(I); Server.Client().Stoppen(); Vertraging(100); Wifi.setAutoReconnect (Valse); Vertraging(100); Wifi.Verbreken(); Vertraging(1000); SetDefaultWiFiConfig(); CreateWifiSoftAP(); Terug; } Anders { Veilige Config Bool SaveOk = referenties opslaan(); InitalizeHTTPServer(); Terug; } } } Als (Server.hasArg hasArg("WiFiMode") En (Server.Arg("WiFiMode") == "2") ) AP-modus wijzigen { startMillis = millis(); Reset Time Up Counter om te voorkomen dat idle mode whiole werken Access Point configureren Temp = Server.Arg("APPointName"); Len = Temp.Lengte(); Temp =Server.Arg("APPW"); Als (Server.hasArg hasArg("PasswordReq")) { I = Temp.Lengte(); } Anders { I = 8; } Als ( ( Len > 1 ) En (Server.Arg("APPW") == Server.Arg("APPWRepeat")) En ( I > 7) ) { Temp = ""; Seriële.println(F("APMode")); MyWiFiConfig MyWiFiConfig.APSTA APSTA = Waar; Access Point- of sation-modus - echte AP-modus Als (Server.hasArg hasArg("CaptivePortal")) { MyWiFiConfig MyWiFiConfig.CapPortal CapPortal = Waar ; CaptivePortal aan in AP-modus } Anders { MyWiFiConfig MyWiFiConfig.CapPortal CapPortal = Valse ; } Als (Server.hasArg hasArg("PasswordReq")) { MyWiFiConfig MyWiFiConfig.PwDReq PwDReq = Waar ; Wachtwoord vereist in ap-modus } Anders { MyWiFiConfig MyWiFiConfig.PwDReq PwDReq = Valse ; } Voor ( I = 0; I < APSTANamelen APSTANameLen;I++) { MyWiFiConfig MyWiFiConfig.APSTAName[I] = 0; } Temp = Server.Arg("APPointName"); Len = Temp.Lengte(); Voor ( I = 0; I < Len;I++) { MyWiFiConfig MyWiFiConfig.APSTAName[I] = Temp[I]; } MyWiFiConfig MyWiFiConfig.APSTAName[Len+1] = '\0'; Temp = ""; Voor ( I = 0; I < WiFiPwdLen WiFiPwdLen;I++) { MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[I] = 0; } Temp = Server.Arg("APPW"); Len = Temp.Lengte(); Voor ( I = 0; I < Len;I++) { MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[I] = Temp[I]; } MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[Len+1] = '\0'; Temp = ""; Als (referenties opslaan()) Sla AP ConfigCongfig op { Temp = "Daten des AP Modes erfolgreich gespeichert. Reboot notwendig."; } Anders { Temp = "Daten des AP Modes fehlerhaft."; } } Anders Als (Server.Arg("APPW") != Server.Arg("APPWRepeat")) { Temp = ""; Temp = "WLAN Passwort nicht gleich. Abgebrochen.; } Anders { Temp = ""; Temp = "WLAN Passwort oder AP Naam zu kurz. Abgebrochen.; } } HTML-koptekst Server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader("Pragma", "no-cache"); Server.sendHeader("Verloopt", "-1"); Server.setContentLength(CONTENT_LENGTH_UNKNOWN); HTML-inhoud Temp += "<! DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name= viewport content='width=device-width, initial-scale=1.0,'>"; Server.Verzenden ( 200, "tekst/html", Temp ); Temp = ""; Temp += "<style type='text/css'><!-- DIV.container { min-hoogte: 10em; weergeven: tabelcel; verticaal uitlijnen: middelste }.button {hoogte:35px; breedte:90px; tekengrootte:16px}"; Temp += "lichaam {achtergrond-kleur: powderblue;} </style><head><title>Smartes Tuerschild - WiFi Settings</title></head>"; Server.sendContent(Temp); Temp = ""; Temp += "<h2>WiFi Einstellungen</h2><body><left>"; Temp += "<table border=2 bgcolor = witte breedte = 500 ><td><h4>Huidige WiFi-instellingen: </h4>"; Als (Server.Client().localIP() == apIP) { Temp += "Mode : Soft Access Point (AP)<br>"; Temp += "SSID : " + Tekenreeks (MyWiFiConfig MyWiFiConfig.APSTAName) + "<br><br>"; } Anders { Temp += "Modus : Station (STA) <br>"; Temp += "SSID : "+ Tekenreeks (MyWiFiConfig MyWiFiConfig.APSTAName) + "<br>"; Temp += "BSSID : " + Wifi.BSSIDstr BSSIDstr()+ "<br><br>"; } Temp += "</td></table><br>"; Server.sendContent(Temp); Temp = ""; Temp += "<form action='/wifi' methode='post'>"; Temp += "<table border=2 bgcolor = witte breedte = 500><tr><th><br>"; Als (MyWiFiConfig MyWiFiConfig.APSTA APSTA == 1) { Temp += "<input type='radio' value='1' name='WiFiMode' > WiFi Station Mode<br>"; } Anders { Temp += "<input type='radio' value='1' name='WiFiMode' checked > WiFi Station Mode<br>"; } Temp += "Available WiFi Networks:<table border=2 bgcolor = white ></tr></th><td>Number </td><td>SSID </td><td>Encryption </td><td>WiFi Strength </td>"; Server.sendContent(Temp); Temp = ""; Wifi.scanDelete(); Int N = Wifi.scanNetwerken(Valse, Valse); WiFi.scanNetworks(async, show_hidden) Als (N > 0) { Voor (Int I = 0; I < N; I++) { Temp += "</tr></th>"; Tekenreeks Nrb = Tekenreeks(I); Temp += "<td>" + Nrb + "</td>"; Temp += "<td>" + Wifi.Ssid(I) +"</td>"; Nrb = GetEncryptionType(Wifi.versleutelingType(I)); Temp += "<td>"+ Nrb + "</td>"; Temp += "<td>" + Tekenreeks(Wifi.Rssi(I)) + "</td>"; } } Anders { Temp += "</tr></th>"; Temp += "<td>1 </td>"; Temp += "<td>No WLAN found</td>"; Temp += "<td> --- </td>"; Temp += "<td> --- </td>"; } Temp += "</table><table border=2 bgcolor = white ></tr></th><td>Connect to WiFi SSID: </td><td><select name='WiFi_Network' >"; Als (N > 0) { Voor (Int I = 0; I < N; I++) { Temp += "<optiewaarde='" + Wifi.Ssid(I) +"'>" + Wifi.Ssid(I) +"</optie>"; } } Anders { Temp += "<option value='No_WiFi_Network'>Geen WiFiNetwork gevonden !/option>"; } Server.sendContent(Temp); Temp = ""; Temp += "</select></td></tr></th></tr></th><td>WiFi Password: </td><td>"; Temp += "<input type='text' name='STAWLanPW' maxlength='40' size='40'>"; Temp += "</td></tr></th><br></th></tr></table></table><table border=2 bgcolor = witte breedte = 500 ><tr><th><<br>"; Server.sendContent(Temp); Temp = ""; Als (MyWiFiConfig MyWiFiConfig.APSTA APSTA == Waar) { Temp += "<input type='radio' name='WiFiMode' value='2' checked> WiFi Access Point Mode <br>"; } Anders { Temp += "<input type='radio' name='WiFiMode' value='2' > WiFi Access Point Mode <br>"; } Temp += "<table border=2 bgcolor = white ></tr></th> <td>WiFi Access Point Name: </td><td>"; Server.sendContent(Temp); Temp = ""; Als (MyWiFiConfig MyWiFiConfig.APSTA APSTA == Waar) { Temp += "<invoertype='text' name='APPointName' maxlength='"+Tekenreeks(APSTANamelen APSTANameLen-1)+"' grootte='30' waarde='" + Tekenreeks(MyWiFiConfig MyWiFiConfig.APSTAName) + "></td>"; } Anders { Temp += "<invoertype='text' name='APPointName' maxlength='"+Tekenreeks(APSTANamelen APSTANameLen-1)+"' grootte='30' ></td>"; } Server.sendContent(Temp); Temp = ""; Als (MyWiFiConfig MyWiFiConfig.APSTA APSTA == Waar) { Temp += "</tr></th><td>WiFi Password: </td><td>"; Temp += "<input type='password' name='APPW' maxlength='"+Tekenreeks(WiFiPwdLen WiFiPwdLen-1)+"' grootte='30' waarde='" + Tekenreeks(MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd) + "'> </td>"; Temp += "</tr></th><td>WiFi-wachtwoord herhalen: </td>"; Temp += "<td><input type='password' name='APPWRepeat' maxlength='"+Tekenreeks(WiFiPwdLen WiFiPwdLen-1)+"' grootte='30' waarde='" + Tekenreeks(MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd) + "'> </td>"; } Anders { Temp += "</tr></th><td>WiFi Password: </td><td>"; Temp += "<input type='password' name='APPW' maxlength='"+Tekenreeks(WiFiPwdLen WiFiPwdLen-1)+"' grootte='30'> </td>"; Temp += "</tr></th><td>WiFi-wachtwoord herhalen: </td>"; Temp += "<td><input type='password' name='APPWRepeat' maxlength='"+Tekenreeks(WiFiPwdLen WiFiPwdLen-1)+"' grootte='30'> </td>"; } Temp += "</tabel>"; Server.sendContent(Temp); Temp = ""; Als (MyWiFiConfig MyWiFiConfig.PwDReq PwDReq) { Temp += "<input type='checkbox' naam='PasswordReq' aangevinkt> Wachtwoord voor inloggen vereist. "; } Anders { Temp += "<invoertype='checkbox' naam='PasswordReq' > Wachtwoord voor inloggen vereist. "; } Server.sendContent(Temp); Temp = ""; Als (MyWiFiConfig MyWiFiConfig.CapPortal CapPortal) { Temp += "<input type='checkbox' naam='CaptivePortal' aangevinkt> Captive Portal activeren"; } Anders { Temp += "<invoertype='checkbox' naam='CaptivePortal' > Captive Portal activeren"; } Server.sendContent(Temp); Temp = ""; Temp += "<br></tr></th></table><br> <button type='submit' name='Settings' value='1' style='height: 50px; breedte: 140px' autofocus>WiFi-instellingen instellen</button>"; Temp += "<button type='submit' name='Reboot' value='1' style='height: 50px; breedte: 200px' >Systeem</button>opnieuw opstarten; Server.sendContent(Temp); Temp = ""; Temp += "<button type='reset' name='action' value='1' style='height: 50px; breedte: 100px' >Reset</button></form>"; Temp += "<table border=2 bgcolor = white width = 500 cellpadding =5 ><caption>><p><h3>Systemlinks:</h2></p></caption><<tr><th><br>"; Server.sendContent(Temp); Temp = ""; Temp += "<a href='/>Hoofdpagina</a><br><br></th></tr></table><br><br>"; temp += "<footer><p>Geprogrammeerd en ontworpen door: Tobias Kuch</p><p>Contactgegevens: <a href='mailto:tobias.kuch@googlemail.com'>tobias.kuch@googlemail.com</a>;<p></footer>"; Temp += "</body></html>"; Server.sendContent(Temp); Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden Temp = ""; } Void handleUploadSave() { Tekenreeks Bestandsgegevens ; Temp = ""; server.send(200); Serial.println("FileUpload"; Serial.println(server.args()); Voor (Byte I = 0; I < Server.Args(); I++) { Temp += "Arg " + (Tekenreeks)I + " –> "; De huidige iteratiewaarde opnemen Temp += Server.argName(I) + ": "; De naam van de parameter krijgen Temp += Server.Arg(I) + "\n"; De waarde van de parameter krijgen } server.send(200, "text/plain", temp); Antwoord op de HTTP-aanvraag Bestandsgegevens = Server.Arg("datei"); Server.sendHeader("Locatie", "filesystem", Waar); Server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader("Pragma", "no-cache"); Server.sendHeader("Verloopt", "-1"); Server.Verzenden ( 302, "tekst/vlakte", ""); Lege inhoud remt Content-length header, dus we moeten de socket zelf sluiten. Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden } /** Is dit een IP? */ Booleaanse Isip(Tekenreeks Str) { Voor (Int I = 0; I < Str.Lengte(); I++) { Int C = Str.charAt(I); Als (C != '.' && (C < '0' || C > '9')) { Terug Valse; } } Terug Waar; } Tekenreeks GetEncryptionType(Byte ditType) { Tekenreeks Output = ""; lees het versleutelingstype en print de naam uit: Schakelen (ditType) { Geval 5: Output = "WEP"; Terug Output; Breken; Geval 2: Output = "WPA"; Terug Output; Breken; Geval 4: Output = "WPA2"; Terug Output; Breken; Geval 7: Output = "None"; Terug Output; Breken; Geval 8: Output = "Auto"; Terug Output; Breken; } } /** IP naar String? */ Tekenreeks toStringIp(IPAddress Ip) { Tekenreeks Res = ""; Voor (Int I = 0; I < 3; I++) { Res += Tekenreeks((Ip >> (8 * I)) & 0xFF) + "."; } Res += Tekenreeks(((Ip >> 8 * 3)) & 0xFF); Terug Res; } Tekenreeks formatBytes(size_t Bytes) { lesbare Anzeige der Speichergrößen Als (Bytes < 1024) { Terug Tekenreeks(Bytes) + " Byte"; } Anders Als (Bytes < (1024 * 1024)) { Terug Tekenreeks(Bytes / 1024.0) + " KB"; } Anders Als (Bytes < (1024 * 1024 * 1024)) { Terug Tekenreeks(Bytes / 1024.0 / 1024.0) + "MB"; } } Tekenreeks getContentType(Tekenreeks Bestandsnaam) { de bestandsextensie converteren naar het MIME-type Als (Bestandsnaam.eindigtMet(".htm")) Terug "tekst/html"; Anders Als (Bestandsnaam.eindigtMet(".css")) Terug "tekst/css"; Anders Als (Bestandsnaam.eindigtMet(".js")) Terug "applicatie/javascript"; Anders Als (Bestandsnaam.eindigtMet(".ico")) Terug "afbeelding/x-pictogram"; Anders Als (Bestandsnaam.eindigtMet(".gz")) Terug "applicatie/x-gzip"; Anders Als (Bestandsnaam.eindigtMet(".bmp")) Terug "beeld/bmp"; Anders Als (Bestandsnaam.eindigtMet(".tif")) Terug "beeld/tiff"; Anders Als (Bestandsnaam.eindigtMet(".pbm")) Terug "image/x-portable-bitmap"; Anders Als (Bestandsnaam.eindigtMet(".jpg")) Terug "afbeelding/jpeg"; Anders Als (Bestandsnaam.eindigtMet(".gif")) Terug "beeld/gif"; Anders Als (Bestandsnaam.eindigtMet(".png")) Terug "afbeelding/png"; Anders Als (Bestandsnaam.eindigtMet(".svg")) Terug "image/svg+xml"; Anders Als (Bestandsnaam.eindigtMet(".html")) Terug "tekst/html"; Anders Als (Bestandsnaam.eindigtMet(".wav")) Terug "audio/x-wav"; Anders Als (Bestandsnaam.eindigtMet(".zip")) Terug "toepassing/zip"; Anders Als (Bestandsnaam.eindigtMet(".rgb")) Terug "beeld/x-rg"; Volledige lijst op https://wiki.selfhtml.org/wiki/MIME-Type/Übersicht Übersicht Terug "tekst/vlakte"; } Bool handleFileRead(Tekenreeks Pad) { het juiste bestand naar de client verzenden (als het bestaat) Serial.println("handleFileRead: " + pad); Als (Pad.eindigtMet("/")) Pad += "index.html"; Als een map wordt aangevraagd, stuurt u het indexbestand Tekenreeks Contenttype = getContentType(Pad); Het MIME-type krijgen Tekenreeks pathWithGz = Pad + ".gz"; Als (SPIFFS (SPIFFS).Bestaat(pathWithGz) || SPIFFS (SPIFFS).Bestaat(Pad)) { Als het bestand bestaat, als gecomprimeerd archief of als normaal Als (SPIFFS (SPIFFS).Bestaat(pathWithGz)) Als er een gecomprimeerde versie beschikbaar is Pad += ".gz"; Gebruik de gecomprimeerde verion Bestand Bestand = SPIFFS (SPIFFS).Open(Pad, "r"); Het bestand openen size_t Verzonden = Server.streamFile(Bestand, Contenttype); Stuur het naar de klant Bestand.Sluiten(); Het bestand opnieuw sluiten Terug Waar; } Terug Valse; } Void Lus() { Als (SoftAccOK SoftAccOK) { dnsServer.processNextRequest(); Dns } HTTP Server.handleClient(); }]
Ik wens u veel plezier met de bestandsserver op de ESP32. In het volgende deel zullen we kijken naar hoe bmp-beelden die zijn opgeslagen op de bestandsserver op LED Matrix-schermen te uitvoeren.
Tot de volgende keer!
5 Reacties
Eberhard
Hallo
heute war ich auf das Captive portal für den ESP8266 gestoßen. Gleich gemacht – und es funktioniert prächtig. Danke für diese Anweisungen.
Nun will ich auch nen Fileserver auf den EWP8266 installieren – das geht aber leider nicht mit dieser Anweisung hier.
Frage: wie kann ich zum Captive portal auf dem ESP8266 einen Fileserver installieren?
Danke im Voraus
Hardy
Tobias
Hallo Sven,
Tausche bitte die Zeile
if (String(MyWiFiConfig.ConfigValid) = String(“TK”)) durch if (String(MyWiFiConfig.ConfigValid) == String(“TK”)) aus. Dann sollte es funktionieren. Leider konnte ich den Fehler erst in Teil 4 der Reihe korrigieren..
Gruß
Peter Pitzeier
Die consts
static const byte WiFiPwdLen = 25;
static const byte APSTANameLen = 20;
sind u.U. nicht ausreichend. Ein WiFi password darf bis zu 63, der Name eines APs max. 32 Zeichen lang sein.
Sven
Also, kompilieren hat ohne Probleme funktioniert, auch das Hochladen. Aber, der Name ESP32 erscheint auf dem Handy nicht, nur ESP_?? und mit dem Passwort kann man sich nicht verbinden. Habe den Namen geändert, hat aber auch nicht geklappt. Ich finde die Idee sehr gut, nur wie klappt es trotzdem? Ich habe auch schon andere Handys probiert, ohne Erfolg. Wäre dankbar für eine Hilfe.
Peter Pitzeier
Wie in den Teilen 1 und 2 steht in bool loadCredentials()
if (String(MyWiFiConfig.ConfigValid) = String(“TK”))
Das kann doch wohl nicht richtig sein, oder? Wenn kein Vergleich mittels ‘==’ , sondern eine Zuweisung ‘=’ erfolgt, wird das ‘if’ immer wahr und damit sinnlos sein.