Ciao e Benvenuto
in una nuova parte della serie di portali ESP Captive. Pollici Oggi Blog espandiamo il nostro Captive Portal con una prima applicazione: Come File Server ! I file fino a un massimo di dimensione interno SPIFFS possono essere caricati tramite il portale web, ma possono anche essere scaricati di nuovo. Al fine di controllare comodamente questa funzione, stiamo aggiungendo un ulterioreE (in questo modon (Sotto)item: Aggiungiamo il punto "Filemanger" come collegamento ai collegamenti di sistema e costruiamo una pagina secondaria con le funzioni di file più importanti di cui un tale file server ha bisogno. La pagina principale del nostro file server si presenta quindi così:
Vediamo il nuovo elemento "Filemanager". A questo punto, stiamo costruendo un nuovo sito web che contiene tutti i punti importanti per la gestione dei file:
Prima di poter utilizzare il file system SPIFFS tramite il nostro webserver per archiviare il nostro primo file, dovremmo formattarlo. C'è anche il link "Format SPIFFS Filesystem", che dopo che è stato cliccato, formatta il file system SPIFFS per il primo utilizzo. Quindi clicchiamo su di esso prima e attendere che il file system sia formattato internamente. Dopo di che, il primo file può essere salvato. Per la memorizzazione/nuova installazione dei file, utilizziamo i pulsanti creati sopra di essi.
Questo sarebbe un pulsante per selezionare un file di spazio su disco locale e un pulsante con cui questo file selezionato può poi essere atterrato sul nostro ESP.
Questo file apparirà dopo un ricaricamento automatico della pagina nella parte superiore sotto "File adorabili su SPIFFS". Da un lato, può essere scaricato di nuovo, ma anche, se non è più necessario, può essere eliminato di nuovo. Più non è più necessario per un sistema di archiviazione di file. La memoria è sufficiente per diversi piccoli file o immagini.
Il codice per il portale CAPtive per ESP32, integrato dalla funzionalità Fileserver, è:
[
#include <Wifi.H> #include <WiFiClient (Client WiFi).H> #include <Web.H> #include <ESPmDNS (informazioni in base al tano).H> #include <SPIFFS.H> #include <Server DNS.H> #include <Eeprom.H> # define GPIO_OUT_W1TS_REG (DR_REG_GPIO_BASE + 0x0008) # define GPIO_OUT_W1TC_REG (DR_REG_GPIO_BASE + 0x000c) Statico Const Byte WiFiPwdLen = 25; Statico Const Byte NomeAPSTALen = 20; Struct WiFiEEPromData { Bool APSTA = Vero; Punto di accesso o modalità di sonnia - vera modalità AP Bool PwDReq = False; PasswordObbligatorio Bool CapPortal = Vero ; CaptivePortal in modalità AP Char Nome APSTA[NomeAPSTALen]; STATION /AP Nome punto A cONNECT, se defondato Char WiFiPwd[WiFiPwdLen]; WiFiPAssword, se detrovato Char ConfigValid (Valido)[3]; Se Config è Vaild, è necessario il tag "TK"" }; /o nome host per mDNS. Dovrebbe funzionare almeno sulle finestre. Provare http://esp8266.local */ Const Char *Nome host ESP = "ESP32"; Server DNS Const Byte DNS_PORT = 53; Server DNS server dns; Conmmon Paramenters Bool SoftAccOK = False; Server Web Web Server(80); // Parametri di rete Soft AP Ipaddress apIP(172, 20, 0, 1); Ipaddress netMsk(255, 255, 255, 0); Unsigned Lungo currentMillis = 0; Unsigned Lungo startMillis; /z: stato Wi-Fi corrente // Breve Stato = WL_IDLE_STATUS; file file fsUpload; un oggetto File per archiviare temporaneamente il file ricevuto WiFiEEPromData MyWiFiConfig; Stringa getContentType (tipo getContentType)(Stringa Filename); convertire l'estensione del file nel tipo MIME Bool handleFileRead(Stringa Percorso); inviare il file corretto al client (se esiste) Vuoto handleFileUpload(); caricare un nuovo file nello SPIFFS Stringa Temp =""; Vuoto Installazione() { REG_WRITE(GPIO_OUT_W1TS_REG, pezzo(GPIO_NUM_16)); Set di correzione degli errori di meditazione Guru Ritardo(1); REG_WRITE(GPIO_OUT_W1TC_REG, pezzo(GPIO_NUM_16)); Guru Meditazione Errore Remediation chiaro Bool ConnectSuccess = False; Bool CreateSoftAPSucc (informazioni in base a un'applicazione di un'azione = False; Bool Sistema CInitFS = False; Bool CInitHTTPServer (server CInitHTTPServer) = False; byte Len; Seriale.Iniziare(9600); Mentre (!Seriale) { ; attendere la connessione della porta seriale. Necessario per USB nativo } Seriale.println(F("Interfaccia seriale initalizzata a 9600 Baud.")); Wifi.setAutoReconnect (False); Wifi.Persistente(False); Wifi.Scollegare(); Wifi.setHostname (nomehost)(Nome host ESP); Impostare il nome host DHCP assegnato alla stazione ESP. Se (loadCredentials()) Caricare le credenziali WLAN per le impostazioni WiFi { Seriale.println(F("Credenziali valide trovate.")); Se (MyWiFiConfig.APSTA == Vero) Modalità AP { Seriale.println(F("Modalità punto di accesso selezionata.")); Len = Strlen(MyWiFiConfig.Nome APSTA); MyWiFiConfig.Nome APSTA[Len+1] = '\0'; Len = Strlen(MyWiFiConfig.WiFiPwd); MyWiFiConfig.WiFiPwd[Len+1] = '\0'; CreateSoftAPSucc (informazioni in base a un'applicazione di un'azione = CreateWifiSoftAP (Informazioni in base ai pulsanti di sè)(); } Altro { Seriale.println(F("Modalità stazione selezionata.")); Len = Strlen(MyWiFiConfig.Nome APSTA); MyWiFiConfig.Nome APSTA[Len+1] = '\0'; Len = Strlen(MyWiFiConfig.WiFiPwd); MyWiFiConfig.WiFiPwd[Len+1] = '\0'; Len = ConnectWifiAP (Connessione WifiAP)(); Se ( Len == 3 ) { ConnectSuccess = Vero; } Altro { ConnectSuccess = False; } } } Altro { Imposta configurazione predefinita - Crea AP Seriale.println(F("NO Credenziali valide trovate.")); SetDefaultWiFiConfig (); CreateSoftAPSucc (informazioni in base a un'applicazione di un'azione = CreateWifiSoftAP (Informazioni in base ai pulsanti di sè)(); saveCredentials (informazioni in base alle credenziali del servizio(); Ritardo(500); } Initalize Filesystem Sistema CInitFS = InitalizeFileSystem (Filesystem)(); Se (!(Sistema CInitFS)) {Seriale.println(F("File System non initalizzato ! ")); } Se ((ConnectSuccess O CreateSoftAPSucc (informazioni in base a un'applicazione di un'azione)) { Seriale.Stampare (F("Indirizzo IP: ")); Se (CreateSoftAPSucc (informazioni in base a un'applicazione di un'azione) { Seriale.println(Wifi.softAPIP());} Se (ConnectSuccess) { Seriale.println(Wifi.localIP (informazioni in locale)());} InitalizeHTTPServer(); } Altro { Seriale.setDebugOutput(Vero); Output di debug per WLAN sull'interfaccia seriale. Seriale.println(F("Errore: Impossibile connettersi alla WLAN. Impostare la configurazione DEFAULT.")); SetDefaultWiFiConfig(); CreateSoftAPSucc (informazioni in base a un'applicazione di un'azione = CreateWifiSoftAP (Informazioni in base ai pulsanti di sè)(); InitalizeHTTPServer(); SetDefaultWiFiConfig(); saveCredentials (informazioni in base alle credenziali del servizio(); } } Vuoto InitalizeHTTPServer() { Bool initok = False; /z Pagine web di installazione: root, pagine di configurazione wifi, così rilevatori di portali captive e non trovati. */ Server.su("/", handleRoot); Server.su("/wifi", handleWifi); Server.su("/filesystem", HTTP_GET,handleDisplayFS); Server.su("/caricamento", HTTP_POST, []() { Server.Invia(200, "testo/semplice", ""); }, handleFileUpload); if (MyWiFiConfig.CapPortal) - server.on("/generate_204", handleRoot); //Portale captive Android. Forse non ne ha bisogno. Potrebbe essere gestito dal gestore notFound. if (MyWiFiConfig.CapPortal) : server.on("/favicon.ico", handleRoot); Un altro portale captive Android. Forse non ne ha bisogno. Potrebbe essere gestito dal gestore notFound. Controllato su Sony Handy if (MyWiFiConfig.CapPortal) - server.on("/fwlink", handleRoot); Portale captive Microsoft. Forse non ne ha bisogno. Potrebbe essere gestito dal gestore notFound. Server.su("/generate_204", handleRoot); Portale captive Android. Forse non ne ha bisogno. Potrebbe essere gestito dal gestore notFound. Server.su("/favicon.ico", handleRoot); Un altro portale captive Android. Forse non ne ha bisogno. Potrebbe essere gestito dal gestore notFound. Controllato su Sony Handy Server.su("/fwlink", handleRoot); Portale captive Microsoft. Forse non ne ha bisogno. Potrebbe essere gestito dal gestore notFound. Server.onNotFound (innotiere) ( handleNotFound ); Speicherung Header-Elemente anfordern server.collectHeaders(Intestazioni, sizeof(Headers)/ sizeof(Headers[0])); Server.Iniziare(); Avvio del server Web } Boolean InitalizeFileSystem (Filesystem)() { Bool initok = False; initok = SPIFFS.Iniziare(); Ritardo(200); Se (!(initok)) { Seriale.println(F("Formato SPIFFS")); SPIFFS.Formato(); initok = SPIFFS.Iniziare(); } Ritorno initok; } Boolean CreateWifiSoftAP (Informazioni in base ai pulsanti di sè)() { Wifi.Scollegare(); Seriale.Stampare(F("Initalize SoftAP")); Se (MyWiFiConfig.PwDReq) { SoftAccOK = Wifi.softAP(MyWiFiConfig.Nome APSTA, MyWiFiConfig.WiFiPwd); Passwortl'nge mindestens 8 zeichen ! } Altro { SoftAccOK = Wifi.softAP(MyWiFiConfig.Nome APSTA); Punto di accesso senza password Funzione di overload:; WiFi.softAP(ssid, password, canale, nascosto) } Ritardo(2000); Senza indugio ho visto l'indirizzo IP vuoto Wifi.softAPConfig (informazioni in base alle(apIP, apIP, netMsk); Se (SoftAccOK) { // Impostare il server DNS reindirizzando tutti i domini all'apIP / server dns.setErrorReplyCode(Codice DI accesso A DNSReply::Nessunerrore); server dns.Iniziare(DNS_PORT, "*", apIP); Seriale.println(F("successo".)); Serial.setDebugOutput(true); Output di debug per WLAN sull'interfaccia seriale. } Altro { Seriale.println(F("Errore Soft AP.")); Seriale.println(MyWiFiConfig.Nome APSTA); Seriale.println(MyWiFiConfig.WiFiPwd); } Ritorno SoftAccOK; } byte ConnectWifiAP (Connessione WifiAP)() { Seriale.println(F("Inizializzazione del client Wifi.")); byte connRes = 0; byte Ho = 0; Wifi.Scollegare(); Wifi.softAPdisconnect (softAPdisconnect)(Vero); Function imposterà SSID attualmente configurato e la password del soft-AP su valori null. Il parametro è facoltativo. Se impostato su true, la modalità soft-AP verrà disattivata. Ritardo(500); Wifi.Iniziare(MyWiFiConfig.Nome APSTA, MyWiFiConfig.WiFiPwd); connRes = Wifi.waitForConnectResult(); Mentre (( connRes == 0 ) E (Ho != 10)) se connRes : 0 "IDLE_STATUS - modificare Statius" { connRes = Wifi.waitForConnectResult(); Ritardo(2000); Ho++; Seriale.Stampare(F(".")); istruzione/i } Mentre (( connRes == 1 ) E (Ho != 10)) se non è possibile raggiungere connRes n. 1 NO_SSID_AVAILin - SSID { connRes = Wifi.waitForConnectResult(); Ritardo(2000); Ho++; Seriale.Stampare(F(".")); istruzione/i } Se (connRes == 3 ) { Wifi.setAutoReconnect(Vero); Impostare se il modulo tenterà di riconnettersi a un punto di accesso nel caso in cui sia disconnesso. Configurare il risponditore MDNS Se (!Mdns.Iniziare(Nome host ESP)) { Seriale.println(F("Errore: MDNS")); } Altro { Mdns.addService (servizio aggiuntivo)("http" (http), "tcp", 80); } } Mentre (( connRes == 4 ) E (Ho != 10)) se connRes : 4 Bad Password. A volte accade questo con corrct PWD { Wifi.Iniziare(MyWiFiConfig.Nome APSTA, MyWiFiConfig.WiFiPwd); connRes = Wifi.waitForConnectResult(); Ritardo(3000); Ho++; Seriale.Stampare(F(".")); } Se (connRes == 4 ) { Seriale.println(F("STA Pwd Err")); Seriale.println(MyWiFiConfig.Nome APSTA); Seriale.println(MyWiFiConfig.WiFiPwd); Wifi.Scollegare(); } if (connRes ) : Serial.println("DISCONNECTED - Non in modalità stazione"); WiFi.printDiag(Serial); Seriale.println(""); Ritorno connRes; } # define SD_BUFFER_PIXELS 20 Vuoto handleFileUpload() { Dateien vom Rechnenknecht oder Klingelkasten ins SPIFFS schreiben Se (Server.Uri() != "/caricamento") Ritorno; Caricamento HTTP& Caricare = Server.Caricare(); Se (Caricare.Stato == UPLOAD_FILE_START) { Stringa Filename = Caricare.Filename; Se (Caricare.Filename.Lunghezza() > 30) { Caricare.Filename = Caricare.Filename.Sottostringa(Caricare.Filename.Lunghezza() - 30, Caricare.Filename.Lunghezza()); Dateinamen auf 30 zeichen k'rzen } Seriale.println("Nome FileUpload: " + Caricare.Filename); Se (!Filename.Startswith("/")) Filename = "/" + Filename; fsUploadFile : SPIFFS.open(nomefile, "w"); file fsUpload = SPIFFS.Aperto("/" + Server.urlDecode (codice di sicurezza)(Caricare.Filename), "w"); Filename = Stringa(); } Altro Se (Caricare.Stato == UPLOAD_FILE_WRITE) { Serial.print("dati di handleFileUpload: "); Serial.println(upload.currentSize); Se (file fsUpload) file fsUpload.Scrivere(Caricare.Buf, Caricare.currentSize (Dimensionicorrente)); } Altro Se (Caricare.Stato == UPLOAD_FILE_END) { Se (file fsUpload) file fsUpload.Vicino(); Serial.print("handleFileUpload Dimensione: "); Serial.println(upload.totalSize); server.sendContent(Intestazione); handleDisplayFS(); } } Vuoto handleDisplayFS() { File system HTML Pagina: /filesystem Temp =""; Intestazione HTML Server.sendHeader (Intestazione)("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader (Intestazione)("Pragma", "no-cache"); Server.sendHeader (Intestazione)("Scadenza", "-1"); Server.setContentLength (lunghezza in cui è impostato)(CONTENT_LENGTH_UNKNOWN); Contenuto HTML Server.Invia ( 200, "testo/html", Temp ); Temp += "<! HTML DOCTYPE><html lang>'de'><head><meta charset''UTF-8'><meta name'viewport content''width'device-width, initial-scale'1.0,'>"; Server.sendContent(Temp); Temp = ""; Temp += "<tipo di stile>'testo/css'><!-- DIV.container : min-height: 10em; display:cella di tabella; vertical-align: middle .button : altezza:35px; width:90px; font-size:16px; Server.sendContent(Temp); Temp = ""; Temp += "corpo: colore di sfondo: powderblue; </style><head><title>Gestore file system</title></head>"; Temp += "<h2>Serial Peripheral Interface Flash System</h2><body><left>"; Server.sendContent(Temp); Temp = ""; Se (Server.Args() > 0) Parametro wurden ubergeben { Se (Server.hasArg("elimina")) { Stringa FToDel = Server.Arg("elimina"); Se (SPIFFS.Esiste(FToDel)) { SPIFFS.Rimuovere(FToDel); Temp += "File" + FToDel + " eliminato con successo."; } Altro { Temp += "File" + FToDel + " non può essere eliminato."; } Server.sendContent(Temp); Temp = ""; } Se (Server.hasArg("formato") E Server.Arg("On")) { SPIFFS.Formato(); Temp += "File system SPI formattato correttamente."; Server.sendContent(Temp); Temp = ""; } server.client().stop(); L'arresto è necessario perché non abbiamo inviato alcuna lunghezza del contenuto } Temp += "<bordo tabella>2 bgcolor , larghezza del bianco , 400 ><td><h4>Stato SPIFFS corrente: </h4>"; Temp += formatBytes (Byte di formato)(SPIFFS.usedBytes (Byte usati)() * 1.05) + " di " di " + formatBytes (Byte di formato)(SPIFFS.totalBytes()) + " utilizzato. <br>"; Temp += formatBytes (Byte di formato)((SPIFFS.totalBytes() - (SPIFFS.usedBytes (Byte usati)() * 1.05)))+ " libero. <br>"; Temp += "</td></tabella><br>"; Server.sendContent(Temp); Temp = ""; Verificare la presenza di parametri del sito Temp += "<bordo tabella<2 bgcolor , larghezza del bianco , 400><tr><th><br>"; Temp += "<h4>File disponibili su SPIFFS:</h4><bordo tabella >2 bgcolor & bianco ></tr></th><td></td><td>Dimensioni</td><td>Azione </td></tr></th>"; Server.sendContent(Temp); Temp = ""; file Radice = SPIFFS.Aperto("/"); file file = Radice.openNextFile (filediopenNext)(); Mentre (file) { Temp += "<td> <un titolo"Download" href + Stringa(file.Nome()) + """ download""" + Stringa(file.Nome()) + "\">" + Stringa(file.Nome()) + "</a> <br></th>"; Temp += "<td>"+ formatBytes (Byte di formato)(file.Dimensione())+ "</td>"; Temp += "<td><a href &filesystem?delete>" + Stringa(file.Nome()) + "> Elimina </a></td>"; Temp += "</tr></th>"; file = Radice.openNextFile (filediopenNext)(); } Temp += "</tr></th>"; Temp += "</td></tr></th><br></th></tr></table></table><br>"; Temp += "<bordo tabella<2 bgcolor , larghezza bianca , 400 ><td><h4>Carica</h4>"; Temp += "<etichetta> Scegli file: </etichetta>"; Temp += "<metodo di forma''AZIONE''POST'''/upload' enctype'''multipart/form-data' style''height:35px;' ><tipo di input''nome'''caricamento' style''altezza:35px; font-size:13px;' obbligatorio>'r'n<tipo di input''submit' value''Carica' classe''pulsante'></form>"; Temp += " </table><br>"; Server.sendContent(Temp); Temp = ""; Temp += "<td><a href > filesystem?format>on> Format SPIFFS Filesystem. (Accetta fino a 30 secondi) </a></td>"; Temp += "<bordo tabella>2 bgcolor , larghezza bianca , 500 cellum, 5 ><didascalia><p><h3>Systemlinks:</h2></p></caption><tr><th><br>& lt;/br>"; Temp += " <a href>Pagina principale</a><br><br></th></tr></tabella><br><br>"; Server.sendContent(Temp); Temp = ""; Temp += "<piè di pagina><p>Programmato e progettato da: Tobias Kuch</p><p>Informazioni di contatto: <a href>'mailto:tobias.kuch@googlemail.com'>tobias.kuch@googlemail.com</a>.</p></footer></body></html>"; server.send ( 200, "", temp ); Server.sendContent(Temp); Server.Client().Fermare(); L'arresto è necessario perché non abbiamo inviato alcuna lunghezza del contenuto Temp = ""; } /z: carica le credenziali WLAN da EEPROM Bool loadCredentials() { Bool RetValue (RetValue); Eeprom.Iniziare(512); Eeprom.Ottieni(0, MyWiFiConfig); Eeprom.Fine(); Se (Stringa(MyWiFiConfig.ConfigValid (Valido)) = Stringa("TK")) { RetValue (RetValue) = Vero; } Altro { RetValue (RetValue) = False; Impostazioni WLAN non trovate. } Ritorno RetValue (RetValue); } /z Memorizzare le credenziali WLAN in EEPROM Bool saveCredentials (informazioni in base alle credenziali del servizio() { Bool RetValue (RetValue); Controllare gli errori logici RetValue (RetValue) = Vero; Se (MyWiFiConfig.APSTA == Vero ) Modalità AP { Se (MyWiFiConfig.PwDReq E (Sizeof(Stringa(MyWiFiConfig.WiFiPwd)) < 8)) { RetValue (RetValue) = False; Configurazione non valida } Se (Sizeof(Stringa(MyWiFiConfig.Nome APSTA)) < 1) { RetValue (RetValue) = False; Configurazione non valida } } Se (RetValue (RetValue)) { Eeprom.Iniziare(512); Per (Int Ho = 0 ; Ho < Sizeof(MyWiFiConfig) ; Ho++) { Eeprom.Scrivere(Ho, 0); } Strncpy( MyWiFiConfig.ConfigValid (Valido) , "TK", Sizeof(MyWiFiConfig.ConfigValid (Valido)) ); Eeprom.Mettere(0, MyWiFiConfig); Eeprom.Commettere(); Eeprom.Fine(); } Ritorno RetValue (RetValue); } Vuoto SetDefaultWiFiConfig() { byte Len; MyWiFiConfig.APSTA = Vero; MyWiFiConfig.PwDReq = Vero; PW predefinito richiesto MyWiFiConfig.CapPortal = Vero; Strncpy( MyWiFiConfig.Nome APSTA, "ESP_Config", Sizeof(MyWiFiConfig.Nome APSTA) ); Len = Strlen(MyWiFiConfig.Nome APSTA); MyWiFiConfig.Nome APSTA[Len+1] = '\0'; Strncpy( MyWiFiConfig.WiFiPwd, "12345678", Sizeof(MyWiFiConfig.WiFiPwd) ); Len = Strlen(MyWiFiConfig.WiFiPwd); MyWiFiConfig.WiFiPwd[Len+1] = '\0'; Strncpy( MyWiFiConfig.ConfigValid (Valido), "TK", Sizeof(MyWiFiConfig.ConfigValid (Valido)) ); Len = Strlen(MyWiFiConfig.ConfigValid (Valido)); MyWiFiConfig.ConfigValid (Valido)[Len+1] = '\0'; Seriale.println(F("Reimposta credenziali WiFi.")); } Vuoto handleRoot() { Pagina principale: Temp = ""; byte Conteggio PicCount = 0; byte ServArgs = 0; Intestazione HTML Server.sendHeader (Intestazione)("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader (Intestazione)("Pragma", "no-cache"); Server.sendHeader (Intestazione)("Scadenza", "-1"); Server.setContentLength (lunghezza in cui è impostato)(CONTENT_LENGTH_UNKNOWN); Contenuto HTML Server.Invia ( 200, "testo/html", Temp ); Speichersparen - Schon mal dem Cleint senden Temp = ""; Temp += "<! HTML DOCTYPE><html lang>'de'><head><meta charset''UTF-8'><meta name'viewport content''width'device-width, initial-scale'1.0,'>"; Server.sendContent(Temp); Temp = ""; Temp += "<tipo di stile>'testo/css'><!-- DIV.container : min-height: 10em; display:cella di tabella; vertical-align: middle .button : altezza:35px; width:90px; font-size:16px; Server.sendContent(Temp); Temp = ""; Temp += "corpo: colore di sfondo: powderblue; </style>"; Temp += "<head><title>Hauptseite</title></head>"; Temp += "<h2>Hauptseite</h2>"; Temp += "<corpo>"; Server.sendContent(Temp); Temp = ""; Elaborazione della richiesta utente Temp = ""; Temp += "<bordo tabella>2 bgcolor , larghezza del bianco , 500 cellpadding 5 ><didascalia><p><h3>Systemlinks:</h2></p></caption>"; Temp += "<tr><th><br>"; Temp += "<a href>'/wifi'>WIFI Einstellungen</a><br><br>"; Temp += "<a href>Filemanager'>Filemanager</a><br><br>"; Temp += "</th></tr></tabella><br><br>"; Temp += "<piè di pagina><p>Programmato e progettato da: Tobias Kuch</p><p>Informazioni di contatto: <a href>'mailto:tobias kuch@googlemail.com'>tobias.kuch@googlemail.com</a>.</p></footer>"; Temp += "</body></html>"; Server.sendContent(Temp); Temp = ""; Server.Client().Fermare(); L'arresto è necessario perché non abbiamo inviato alcuna lunghezza del contenuto } Vuoto handleNotFound() { Se (captivePortal()) { Se caprive portale reindirizzare invece di visualizzare la pagina di errore. Ritorno; } Se (!handleFileRead(Server.Uri())) { Temp = ""; Intestazione HTML Server.sendHeader (Intestazione)("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader (Intestazione)("Pragma", "no-cache"); Server.sendHeader (Intestazione)("Scadenza", "-1"); Server.setContentLength (lunghezza in cui è impostato)(CONTENT_LENGTH_UNKNOWN); Contenuto HTML Temp += "<! HTML DOCTYPE><html lang>'de'><head><meta charset''UTF-8'><meta name'viewport content''width'device-width, initial-scale'1.0,'>"; Temp += "<tipo di stile>'testo/css'><!-- DIV.container : min-height: 10em; display:cella di tabella; vertical-align: middle .button : altezza:35px; width:90px; font-size:16px; Temp += "corpo: colore di sfondo: powderblue; </style>"; Temp += "<capo><titolo>File non trovato</titolo></head>"; Temp += "<h2> 404 File non trovato</h2><br>"; Temp += "<h4>Informazioni di debug:</h4><br>"; Temp += "<corpo>"; Temp += "URI: "; Temp += Server.Uri(); Temp += "NMetodo: "; Temp+= ( Server.Metodo() == HTTP_GET ) ? "OTTIENI" : "Post" (Posta); Temp += "<br>Argomenti: "; Temp += Server.Args(); Temp += "N"; Per ( uint8_t Ho = 0; Ho < Server.Args(); Ho++ ) { Temp += " " + Server.argName (nome arg) ( Ho ) + ": " + Server.Arg ( Ho ) + "N"; } Temp += "<br>Intestazione host server: "+ Server.hostHeader (intestazione host)(); Per ( uint8_t Ho = 0; Ho < Server.Intestazioni(); Ho++ ) { Temp += " " + Server.Headername ( Ho ) + ": " + Server.Intestazione ( Ho ) + "<br>"; } Temp += "</tabella></form><br><br><bordo tabella 2 bgcolor lt;caption><p><h2>È possibile passare a:</h2></p></caption>"; Temp += "<tr><th>"; Temp += "<a href>Pagina principale</a><br>"; Temp += "<a href>Impostazioni WIFI</a><br>"; Temp += "<a href>'/filesystem'>Filemanager</a><br>"; Temp += "</th></tr></tabella><br><br>"; Temp += "<piè di pagina><p>Programmato e progettato da: Tobias Kuch</p><p>Informazioni di contatto: <a href>'mailto:tobias kuch@googlemail.com'>tobias.kuch@googlemail.com</a>.</p></footer>"; Temp += "</body></html>"; Server.Invia ( 404, "", Temp ); Server.Client().Fermare(); L'arresto è necessario perché non abbiamo inviato alcuna lunghezza del contenuto Temp = ""; } } Se abbiamo ricevuto una richiesta per un altro dominio, reindirizza al portale captive. Restituisce true in questo caso in modo che il gestore di pagina non tenti di gestire nuovamente la richiesta. */ Boolean captivePortal() { Se (!isIp (isIp)(Server.hostHeader (intestazione host)()) && Server.hostHeader (intestazione host)() != (Stringa(Nome host ESP)+".local")) { Serial.println("Richiesta reindirizzata al portale captive"); Server.sendHeader (Intestazione)("Posizione", Stringa("http://") + toStringIp (Informazioni in base a toStringIp(Server.Client().localIP (informazioni in locale)()), Vero); Server.Invia ( 302, "testo/semplice", ""); Il contenuto vuoto inibisce l'intestazione Content-length, quindi dobbiamo chiudere il socket da soli. Server.Client().Fermare(); L'arresto è necessario perché non abbiamo inviato alcuna lunghezza del contenuto Ritorno Vero; } Ritorno False; } /- Gestore di pagina di config Wifi . Vuoto handleWifi() { Pagina: /wifi byte Ho; byte Len ; Temp = ""; Verificare la presenza di parametri del sito Se (Server.hasArg("Riavvia") ) Riavvia il sistema { Temp = "Riavvio del sistema in 5 secondi."; Server.Invia ( 200, "testo/html", Temp ); Ritardo(5000); Server.Client().Fermare(); Wifi.Scollegare(); Ritardo(1000); } Se (Server.hasArg("WiFiMode" (Modalità WiFi)) E (Server.Arg("WiFiMode" (Modalità WiFi)) == "1") ) STA Station Mode Connettersi a un'altra stazione WIFI { startMillis = millis(); Reset Time Up Counter per evitare il funzionamento della modalità di inattività Connettersi a STATION esistente Se ( Sizeof(Server.Arg("WiFi_Network")) > 0 ) { Seriale.println("Modalità STA"); MyWiFiConfig.APSTA = False; Modalità punto di accesso o stazione - modalità stazione falsa Temp = ""; Per ( Ho = 0; Ho < NomeAPSTALen;Ho++) { MyWiFiConfig.Nome APSTA[Ho] = 0; } Temp = Server.Arg("WiFi_Network"); Len = Temp.Lunghezza(); Per ( Ho = 0; Ho < Len;Ho++) { MyWiFiConfig.Nome APSTA[Ho] = Temp[Ho]; } Temp = ""; Per ( Ho = 0; Ho < WiFiPwdLen;Ho++) { MyWiFiConfig.WiFiPwd[Ho] = 0; } Temp = Server.Arg("STAWLanPW"); Len = Temp.Lunghezza(); Per ( Ho = 0; Ho < Len;Ho++) { Se (Temp[Ho] > 32) Steuerzeichen Raus { MyWiFiConfig.WiFiPwd[Ho] = Temp[Ho]; } } Temp = "WiFi Connect to AP: -"; Temp += MyWiFiConfig.Nome APSTA; Temp += "-<br>WiFi PW: -"; Temp += MyWiFiConfig.WiFiPwd; Temp += "-<br>"; Temp += "Connessione alla modalità STA in 2 secondi.. <br>"; Server.Invia ( 200, "testo/html", Temp ); Server.sendContent(Temp); Ritardo(2000); Server.Client().Fermare(); Server.Fermare(); Temp = ""; Wifi.Scollegare(); Wifi.softAPdisconnect (softAPdisconnect)(Vero); Ritardo(500); ConnectWifiAP (Connessione WifiAP) Bool SaveOk (Ok) = saveCredentials (informazioni in base alle credenziali del servizio(); Ho = ConnectWifiAP (Connessione WifiAP)(); Ritardo(700); Se (Ho != 3) 4: WL_CONNECT_FAILED - Password non corretta 1: WL_NO_SSID_AVAILin - Impossibile raggiungere l'SSID configurato { Seriale.Stampare(F("Impossibile connettersi alla rete specificata. Motivo: ")); Seriale.println(Ho); Server.Client().Fermare(); Ritardo(100); Wifi.setAutoReconnect (False); Ritardo(100); Wifi.Scollegare(); Ritardo(1000); SetDefaultWiFiConfig(); CreateWifiSoftAP (Informazioni in base ai pulsanti di sè)(); Ritorno; } Altro { Configurazione sicura Bool SaveOk (Ok) = saveCredentials (informazioni in base alle credenziali del servizio(); InitalizeHTTPServer(); Ritorno; } } } Se (Server.hasArg("WiFiMode" (Modalità WiFi)) E (Server.Arg("WiFiMode" (Modalità WiFi)) == "2") ) Cambia modalità AP { startMillis = millis(); Reset Time Up Counter per evitare il funzionamento della modalità di inattività Configurare il punto di accesso Temp = Server.Arg("NomeAPPoint"); Len = Temp.Lunghezza(); Temp =Server.Arg("APPW"); Se (Server.hasArg("PasswordReq")) { Ho = Temp.Lunghezza(); } Altro { Ho = 8; } Se ( ( Len > 1 ) E (Server.Arg("APPW") == Server.Arg("APPWRipeti")) E ( Ho > 7) ) { Temp = ""; Seriale.println(F("APMode" (Modalità API))); MyWiFiConfig.APSTA = Vero; Punto di accesso o modalità di sonnia - vera modalità AP Se (Server.hasArg("CaptivePortal")) { MyWiFiConfig.CapPortal = Vero ; CaptivePortal in modalità AP } Altro { MyWiFiConfig.CapPortal = False ; } Se (Server.hasArg("PasswordReq")) { MyWiFiConfig.PwDReq = Vero ; Password richiesta in modalità AP } Altro { MyWiFiConfig.PwDReq = False ; } Per ( Ho = 0; Ho < NomeAPSTALen;Ho++) { MyWiFiConfig.Nome APSTA[Ho] = 0; } Temp = Server.Arg("NomeAPPoint"); Len = Temp.Lunghezza(); Per ( Ho = 0; Ho < Len;Ho++) { MyWiFiConfig.Nome APSTA[Ho] = Temp[Ho]; } MyWiFiConfig.Nome APSTA[Len+1] = '\0'; Temp = ""; Per ( Ho = 0; Ho < WiFiPwdLen;Ho++) { MyWiFiConfig.WiFiPwd[Ho] = 0; } Temp = Server.Arg("APPW"); Len = Temp.Lunghezza(); Per ( Ho = 0; Ho < Len;Ho++) { MyWiFiConfig.WiFiPwd[Ho] = Temp[Ho]; } MyWiFiConfig.WiFiPwd[Len+1] = '\0'; Temp = ""; Se (saveCredentials (informazioni in base alle credenziali del servizio()) Salva AP ConfigCongfig { Temp = "Daten des AP Modes erfolgreich gespeichert. Riavviare notwendig."; } Altro { Temp = "Daten des AP Modes fehlerhaft."; } } Altro Se (Server.Arg("APPW") != Server.Arg("APPWRipeti")) { Temp = ""; Temp = "WLAN Passwort nicht gleich. Abgebrochen ".; } Altro { Temp = ""; Temp = "WLAN Passwort oder AP Nome zu kurz. Abgebrochen ".; } } Intestazione HTML Server.sendHeader (Intestazione)("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader (Intestazione)("Pragma", "no-cache"); Server.sendHeader (Intestazione)("Scadenza", "-1"); Server.setContentLength (lunghezza in cui è impostato)(CONTENT_LENGTH_UNKNOWN); Contenuto HTML Temp += "<! HTML DOCTYPE><html lang>'de'><head><meta charset''UTF-8'><meta name'viewport content''width'device-width, initial-scale'1.0,'>"; Server.Invia ( 200, "testo/html", Temp ); Temp = ""; Temp += "<tipo di stile>'testo/css'><!-- DIV.container : min-height: 10em; display:cella di tabella; vertical-align: middle .button : altezza:35px; width:90px; font-size:16px; Temp += "corpo: colore di sfondo: powderblue; </style><head><title>Smartes Tuerschild - Impostazioni WiFi</title></head>"; Server.sendContent(Temp); Temp = ""; Temp += "<h2>WiFi Einstellungen</h2><corpo><sinistra>"; Temp += "<bordo tabella>2 bgcolor , larghezza bianca , 500 ><td><h4>Impostazioni WiFi correnti: </h4>"; Se (Server.Client().localIP (informazioni in locale)() == apIP) { Temp += "Modalità : Punto di accesso soft (AP)<br>"; Temp += "SSID : " + Stringa (MyWiFiConfig.Nome APSTA) + "<br><br>"; } Altro { Temp += "Modalità: Stazione (STA) <br>"; Temp += "SSID : "+ Stringa (MyWiFiConfig.Nome APSTA) + "<br>"; Temp += "BSSID : " + Wifi.BSSIDstr()+ "<br><br>"; } Temp += "</td></tabella><br>"; Server.sendContent(Temp); Temp = ""; Temp += "<azione di forma''/wifi' metodo''post'>"; Temp += "<bordo tabella>2 bgcolor , larghezza del bianco , 500><tr><th><br>"; Se (MyWiFiConfig.APSTA == 1) { Temp += "<tipo di ingresso'valore 'radio' '1' nome''WiFiMode' > Modalità stazione WiFi<br>"; } Altro { Temp += "<tipo di ingresso'valore 'radio' '1' nome''WiFiMode' checked > Modalità stazione WiFi<br>"; } Temp += "Reti WiFi disponibili:<bordo tabella>2 bgcolor ></tr></th><td>Numero </td><< td>SSID </td><td>Crittografia </td><td>Forza WiFi </td>"; Server.sendContent(Temp); Temp = ""; Wifi.scanDelete(); Int N = Wifi.scanNetworks(False, False); WiFi.scanNetworks(async, show_hidden) Se (N > 0) { Per (Int Ho = 0; Ho < N; Ho++) { Temp += "</tr></th>"; Stringa Nrb = Stringa(Ho); Temp += "<td>" + Nrb + "</td>"; Temp += "<td>" + Wifi.Ssid(Ho) +"</td>"; Nrb = Tipo di crittografia GetEncryptionType(Wifi.encryptionType (tipo di crittografia)(Ho)); Temp += "<td>"+ Nrb + "</td>"; Temp += "<td>" + Stringa(Wifi.Rssi(Ho)) + "</td>"; } } Altro { Temp += "</tr></th>"; Temp += "<td>1 </td>"; Temp += "<td>Nessuna WLAN trovata</td>"; Temp += "<td> --- </td>"; Temp += "<td> --- </td>"; } Temp += "</tabella><table border>2 bgcolor </tr></th><td>Connetti a SSID WiFi: </td><td><selezionare nome<'WiFi_Network''>"; Se (N > 0) { Per (Int Ho = 0; Ho < N; Ho++) { Temp += "<valore opzione'' + Wifi.Ssid(Ho) +"'>" + Wifi.Ssid(Ho) +"</opzione>"; } } Altro { Temp += "<valore opzione:'No_WiFi_Network'>Nessuna rete WiFi (nessuna rete WiFi)!/opzione>"; } Server.sendContent(Temp); Temp = ""; Temp += "</select></td></tr></th></tr></th><td>Password WiFi: </td><td>"; Temp += "<tipo di input''testo' nome''STAWLanPW' maxlength''40' dimensione ''40'>"; Temp += "</td></tr></th><br></th></tr></table></table><table border<2 bgcolor - 500 ><tr><th><<table border<<table border<2 bgcolor; Server.sendContent(Temp); Temp = ""; Se (MyWiFiConfig.APSTA == Vero) { Temp += "<tipo di ingresso:'radio' nome''WiFiMode' valore''2' checked> Modalità punto di accesso WiFi <br>"; } Altro { Temp += "<tipo di ingresso>'radio' nome'''WiFiMode' value''2' > Modalità punto di accesso WiFi <br>"; } Temp += "<bordo tabella>2 bgcolor <</tr></th> <td>Nome punto di accesso WiFi: </td><td>"; Server.sendContent(Temp); Temp = ""; Se (MyWiFiConfig.APSTA == Vero) { Temp += "<tipo di input''testo' nome''NomeAPPoint' maxlength''"+Stringa(NomeAPSTALen-1)+"' dimensione''30' valore'' + Stringa(MyWiFiConfig.Nome APSTA) + "'></td>"; } Altro { Temp += "<tipo di input''testo' nome''NomeAPPoint' maxlength''"+Stringa(NomeAPSTALen-1)+"' dimensione:'30' ></td>"; } Server.sendContent(Temp); Temp = ""; Se (MyWiFiConfig.APSTA == Vero) { Temp += "</tr></th><td>Password WiFi: </td><td>"; Temp += "<tipo di input''password' nome''APPW' maxlength''"+Stringa(WiFiPwdLen-1)+"' dimensione''30' valore'' + Stringa(MyWiFiConfig.WiFiPwd) + "'> </td>"; Temp += "</tr></th><td>Ripeti password WiFi: </td>"; Temp += "<td><tipo di input''password' nome''APPWRepeat' maxlength''"+Stringa(WiFiPwdLen-1)+"' dimensione''30' valore'' + Stringa(MyWiFiConfig.WiFiPwd) + "'> </td>"; } Altro { Temp += "</tr></th><td>Password WiFi: </td><td>"; Temp += "<tipo di input''password' nome''APPW' maxlength''"+Stringa(WiFiPwdLen-1)+"'dimensione:'30'> </td>"; Temp += "</tr></th><td>Ripeti password WiFi: </td>"; Temp += "<td><tipo di input''password' nome''APPWRepeat' maxlength''"+Stringa(WiFiPwdLen-1)+"'dimensione:'30'> </td>"; } Temp += "</tabella>"; Server.sendContent(Temp); Temp = ""; Se (MyWiFiConfig.PwDReq) { Temp += "<tipo di input:'casella di controllo' nome''PasswordReq' checked> Password per l'accesso richiesto. "; } Altro { Temp += "<tipo di input:'checkbox' name'''PasswordReq' > Password per l'accesso richiesta. "; } Server.sendContent(Temp); Temp = ""; Se (MyWiFiConfig.CapPortal) { Temp += "<tipo di input:'checkbox' name'''CaptivePortal' checked> Attiva Captive Portal'; } Altro { Temp += "<tipo di input:'checkbox' name''''CaptivePortal' > Attiva captive Portal"; } Server.sendContent(Temp); Temp = ""; Temp += "<br></tr></th></table><br> <button type''submit' name'''Settings' value''1' style''height: 50px; larghezza: autofocus di 140px>Imposta impostazioni WiFi</pulsante>"; Temp += "<tipo di pulsante''submit' name'''Reboot' value''1' style''height: 50px; larghezza: 200px' > Sistema di riavvio</pulsante>"; Server.sendContent(Temp); Temp = ""; Temp += "<tipo di pulsante''reset' name'''action' value''1' style''height: 50px; larghezza: 100px' >Reimposta</pulsante></form>"; Temp += "<bordo tabella>2 bgcolor , larghezza bianca , 500 cellum, 5 ><didascalia><p><h3>Systemlinks:</h2></p></caption><tr><th><br>& lt;/br>"; Server.sendContent(Temp); Temp = ""; Temp += "<a href>Pagina principale</a><br><br></th></tr></tabella><br><br>"; temp "<piè di pagina><p>Programmato e progettato da: Tobias Kuch</p><p>Informazioni di contatto: <a href>'mailto:tobias.kuch@googlemail.com'>tobias.kuch@googlemail.com</a>.</p></footer>"; Temp += "</body></html>"; Server.sendContent(Temp); Server.Client().Fermare(); L'arresto è necessario perché non abbiamo inviato alcuna lunghezza del contenuto Temp = ""; } Vuoto handleUploadSalva() { Stringa Filedata ; Temp = ""; server.send(200); Serial.println("FileUpload"); Serial.println(server.args()); Per (byte Ho = 0; Ho < Server.Args(); Ho++) { Temp += "Arg" + (Stringa)Ho + " –> "; Includere il valore di iterazione corrente Temp += Server.argName (nome arg)(Ho) + ": "; Ottenere il nome del parametro Temp += Server.Arg(Ho) + "N"; Ottenere il valore del parametro } server.invio(200, "testo/semplice", temp); Risposta alla richiesta HTTP Filedata = Server.Arg("datei"); Server.sendHeader (Intestazione)("Posizione", "filesystem", Vero); Server.sendHeader (Intestazione)("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader (Intestazione)("Pragma", "no-cache"); Server.sendHeader (Intestazione)("Scadenza", "-1"); Server.Invia ( 302, "testo/semplice", ""); Il contenuto vuoto inibisce l'intestazione Content-length, quindi dobbiamo chiudere il socket da soli. Server.Client().Fermare(); L'arresto è necessario perché non abbiamo inviato alcuna lunghezza del contenuto } Si tratta di un indirizzo IP? */ Boolean isIp (isIp)(Stringa Str) { Per (Int Ho = 0; Ho < Str.Lunghezza(); Ho++) { Int C = Str.charAt(Ho); Se (C != '.' && (C < '0' || C > '9')) { Ritorno False; } } Ritorno Vero; } Stringa Tipo di crittografia GetEncryptionType(byte ThisType (tipo)) { Stringa Output = ""; leggere il tipo di crittografia e stampare il nome: Interruttore (ThisType (tipo)) { Caso 5: Output = "WEP"; Ritorno Output; Pausa; Caso 2: Output = "WPA"; Ritorno Output; Pausa; Caso 4: Output = "WPA2"; Ritorno Output; Pausa; Caso 7: Output = "Nessuno"; Ritorno Output; Pausa; Caso 8: Output = "Auto"; Ritorno Output; Pausa; } } da IP a stringa? */ Stringa toStringIp (Informazioni in base a toStringIp(Ipaddress Ip) { Stringa Res = ""; Per (Int Ho = 0; Ho < 3; Ho++) { Res += Stringa((Ip >> (8 * Ho)) & 0xff) + "."; } Res += Stringa(((Ip >> 8 * 3)) & 0xff); Ritorno Res; } Stringa formatBytes (Byte di formato)(Size_t Byte) { lesbare Anzeige der Speichergràen Se (Byte < 1024) { Ritorno Stringa(Byte) + " Byte"; } Altro Se (Byte < (1024 * 1024)) { Ritorno Stringa(Byte / 1024.0) + " KB"; } Altro Se (Byte < (1024 * 1024 * 1024)) { Ritorno Stringa(Byte / 1024.0 / 1024.0) + " MB "; } } Stringa getContentType (tipo getContentType)(Stringa Filename) { convertire l'estensione del file nel tipo MIME Se (Filename.endsWith(".htm")) Ritorno "testo/html"; Altro Se (Filename.endsWith(".css")) Ritorno "testo/css"; Altro Se (Filename.endsWith(".js" (informazioni in questo conto in questo sin)) Ritorno "applicazione/javascript"; Altro Se (Filename.endsWith(".ico")) Ritorno "immagine/icona x"; Altro Se (Filename.endsWith(".gz")) Ritorno "applicazione/x-gzip"; Altro Se (Filename.endsWith(".bmp")) Ritorno "immagine/bmp"; Altro Se (Filename.endsWith(".tif")) Ritorno "immagine/tiff"; Altro Se (Filename.endsWith(".pbm")) Ritorno "immagine/x-bitmap"; Altro Se (Filename.endsWith(".jpg")) Ritorno "immagine/jpeg"; Altro Se (Filename.endsWith(".gif")) Ritorno "immagine/gif"; Altro Se (Filename.endsWith(".png")) Ritorno "immagine/png"; Altro Se (Filename.endsWith(".svg")) Ritorno "immagine/svg-xml"; Altro Se (Filename.endsWith(".html")) Ritorno "testo/html"; Altro Se (Filename.endsWith(".wav")) Ritorno "audio/x-wav"; Altro Se (Filename.endsWith(".zip")) Ritorno "applicazione/zip"; Altro Se (Filename.endsWith(".rgb")) Ritorno "immagine/x-rg"; Completa elenco su https://wiki.selfhtml.org/wiki/MIME-Type/Ebersicht Ritorno "testo/semplice"; } Bool handleFileRead(Stringa Percorso) { inviare il file corretto al client (se esiste) Serial.println("handleFileRead: " - percorso); Se (Percorso.endsWith("/")) Percorso += "index.html"; Se viene richiesta una cartella, inviare il file di indice Stringa Contenttype = getContentType (tipo getContentType)(Percorso); Ottenere il tipo MIMEGet the MIME type Stringa percorsoWithGz = Percorso + ".gz"; Se (SPIFFS.Esiste(percorsoWithGz) || SPIFFS.Esiste(Percorso)) { Se il file esiste, come archivio compresso o normale Se (SPIFFS.Esiste(percorsoWithGz)) Se è disponibile una versione compressa Percorso += ".gz"; Utilizzare la verion compressa file file = SPIFFS.Aperto(Percorso, "r"); Aprire il file Size_t Inviato = Server.streamFile(file, Contenttype); Inviarlo al client file.Vicino(); Chiudere di nuovo il file Ritorno Vero; } Ritorno False; } Vuoto Ciclo() { Se (SoftAccOK) { server dns.processNextRequest (richiesta di processosuccessivo)(); Dns } HTTP (informazioni in due Server.handleClient(); }]
Vi auguro un sacco di divertimento con il file server sul ESP32. Nella parte successiva vedremo come emettere le immagini BMP memorizzate sul file server sui display a matrice LED.
Alla prossima!
5 commenti
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.