Captive Portal Blog: Een bestandsserver voor ESP32 Deel 3

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='/wifi'>WIFI Einstellungen</a><br><br>";   Temp += "<a href='/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='/'>Hoofdpagina</a><br>";     Temp += "<a href='/wifi'>WIFI Settings</a><br>";     Temp += "<a href='/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!

Esp-8266Projekte für fortgeschrittene

4 Kommentare

Tobias

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

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

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

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.

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Aanbevolen blog berichten

  1. Installeer ESP32 nu van de raad van bestuur
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP Programmeren via Wi-Fi