Captive Portal Blog: Ein Fileserver für den ESP32 Teil 3 - AZ-Delivery

Bonjour et Bienvenue

à une nouvelle partie de la série portail ESP Captive. Dans Aujourd'hui Blog nous élargissons notre portail captif avec une première application: Comme File Server ! Les fichiers jusqu’à un maximum de la taille interne SPIFFS peuvent être téléchargés via le portail Web, mais peuvent également être téléchargés à nouveau. Afin de contrôler commodément cette fonction, nous ajoutons uneEn (Sous)élément: Nous ajoutons le point "Filemanger" comme un lien vers les liens du système, et de construire une sous-page avec les fonctions de fichier les plus importantes dont un tel serveur de fichiers a besoin. La page principale de notre serveur de fichiers ressemble alors à ceci:

Nous voyons le nouvel élément "Filemanager". À ce stade, nous construisons un nouveau site Web qui contient tous les points importants pour la gestion des fichiers:

Avant de pouvoir utiliser le système de fichiers SPIFFS via notre serveur web pour déposer notre premier fichier, nous devrions le formater. Il existe également le lien "Format SPIFFS Filesystem", qui, après avoir été cliqué, formate le système de fichiers SPIFFS pour la première utilisation. Nous cliquons donc d’abord et attendons que le système de fichiers soit formaté en interne. Après cela, le premier fichier peut être enregistré. Pour le stockage/nouvelle installation de fichiers, nous utilisons les boutons créés au-dessus d’eux.

Il s’agirait d’un bouton pour sélectionner un fichier d’espace disque local et d’un bouton avec lequel ce fichier sélectionné peut ensuite être atterri sur notre ESP.

Ce fichier apparaîtra ensuite après un rechargement automatique de la page dans la partie supérieure sous "Avaliable Files on SPIFFS". D’une part, il peut être téléchargé à nouveau, mais aussi, si elle n’est plus nécessaire, il peut être supprimé à nouveau. Plus n’est plus nécessaire pour un système de stockage de fichiers. La mémoire est suffisante pour plusieurs petits fichiers ou images.

Le code du portail CAPtive pour l’ESP32, complété par la fonctionnalité Fileserver, se lit comme suit :

[

#include <Wifi.H (en)>
#include <WiFiClient (WiFiClient).H (en)> 
#include <Web.H (en)>
#include <ESPmDNS (EN ANGLAIS).H (en)>
#include <SPIFFS SPIFFS.H (en)>
#include <DNSServateur.H (en)>
#include <Eeprom.H (en)>

#define GPIO_OUT_W1TS_REG (DR_REG_GPIO_BASE + 0x0008)
#define GPIO_OUT_W1TC_REG (DR_REG_GPIO_BASE + 0x000c)

Statique Const Octet WiFiPwdLen (WiFiPwdLen) = 25;
Statique Const Octet APSTANameLen = 20;

Struct WiFiEEPromData   {     Bool APSTA APSTA = Vrai; Point d’accès ou mode Sation - vrai mode AP     Bool PwDReq (en) = Faux; Mot de passeRequired     Bool CapPortal (CapPortal) = Vrai ; CaptivePortal en mode AP     Char Char APSTAName APSTAName[APSTANameLen]; STATION /AP Point Name TO conneCT, s’il est déca fondé        Char Char WiFiPwd (WiFiPwd)[WiFiPwdLen (WiFiPwdLen)]; WiFiPAssword, s’il est défini         Char Char ConfigValid[3]; Si Config est Vaild, tag "TK" est nécessaire"   };

/ nom d’hôte pour mDNS. Devrait travailler au moins sur les fenêtres. Essayer http://esp8266.local */
Const Char Char *ESPHostname ESPHostname = "ESP32";

Serveur DNS
Const Octet DNS_PORT = 53;
DNSServateur dnsServateur;

Conmmon Paramenters
Bool SoftAccOK (en)  = Faux;

Serveur Web
Web Serveur(80);

/Paramètres du réseau AP doux //
Ipaddress apIP(172, 20, 0, 1);
Ipaddress netMsk netMsk (en)(255, 255, 255, 0);

Unsigned Long currentMillis = 0;
Unsigned Long startMillis;

/- Statut Wi-Fi actuel //
Court Statut = WL_IDLE_STATUS;

Fichier fsUploadFile;              un objet de fichier pour stocker temporairement le fichier reçu
WiFiEEPromData MyWiFiConfig (en);
String getContentType(String Fichier); convertir l’extension du fichier au type MIME
Bool handleFileRead(String Chemin);       envoyer le bon fichier au client (s’il existe)
Vide poignéeFileUpload();                télécharger un nouveau fichier sur le SPIFFS
String Temp ="";


Vide Configuration() 
{   REG_WRITE(GPIO_OUT_W1TS_REG, Peu(GPIO_NUM_16));     Ensemble d’assainissement d’erreur de méditation De gourou   Retard(1);   REG_WRITE(GPIO_OUT_W1TC_REG, Peu(GPIO_NUM_16));     Guru Méditation Erreur d’assainissement clair   Bool ConnectSuccess = Faux;   Bool CréerSoftAPSucc  = Faux;   Bool CInitFSSystem (en)  = Faux;   Bool CInitHTTPServateur  = Faux;   Octet Len;    Série.Commencer(9600);    Tandis que (!Série) {     ; attendre que le port en série se connecte. Nécessaire pour l’USB natif   }   Série.println(F("Serial Interface initalisé au 9600 Baud."));    Wifi.setAutoReconnect (Faux);   Wifi.Persistante(Faux);   Wifi.Débrancher();    Wifi.setHostname setHostname(ESPHostname ESPHostname); Réglez le nom d’hôte DHCP affecté à la station ESP.   Si (chargeCredentials()) Chargez les informations d’identification WLAN pour les paramètres WiFi   {       Série.println(F("Qualifications valides trouvées."));         Si (MyWiFiConfig (en).APSTA APSTA == Vrai)  AP Mode       {          Série.println(F("Mode point d’accès sélectionné."));          Len = Strlen(MyWiFiConfig (en).APSTAName APSTAName);         MyWiFiConfig (en).APSTAName APSTAName[Len+1] = '\0';          Len = Strlen(MyWiFiConfig (en).WiFiPwd (WiFiPwd));         MyWiFiConfig (en).WiFiPwd (WiFiPwd)[Len+1] = '\0';           CréerSoftAPSucc = CréerWifiSoftAP();       } Autre       {         Série.println(F("Mode Station sélectionné."));                Len = Strlen(MyWiFiConfig (en).APSTAName APSTAName);         MyWiFiConfig (en).APSTAName APSTAName[Len+1] = '\0';          Len = Strlen(MyWiFiConfig (en).WiFiPwd (WiFiPwd));         MyWiFiConfig (en).WiFiPwd (WiFiPwd)[Len+1] = '\0';         Len = ConnectWifiAP (en)();              Si ( Len == 3 ) { ConnectSuccess = Vrai; } Autre { ConnectSuccess = Faux; }            }   } Autre   { Définir par défaut Config - Créer AP      Série.println(F("Aucun titre d’identification valide trouvé."));       SetDefaultWiFiConfig ();      CréerSoftAPSucc = CréerWifiSoftAP();       saveCredentials (en)();      Retard(500);        }   Initaliser filesystem   CInitFSSystem (en) = InitalizeFileSystem();    Si (!(CInitFSSystem (en))) {Série.println(F("Système de fichiers pas initalisé ! ")); }    Si ((ConnectSuccess Ou CréerSoftAPSucc))     {                Série.Imprimer (F("Adresse IP: "));       Si (CréerSoftAPSucc) { Série.println(Wifi.softAPIP softAPIP());}          Si (ConnectSuccess) { Série.println(Wifi.localIP());}       InitalizeHTTPServer();          }     Autre     {       Série.setDebugOutput(Vrai); Debug Sortie pour WLAN sur Serial Interface.       Série.println(F("Erreur: Ne peut pas se connecter à WLAN. Définissez la configuration DEFAULT."));       SetDefaultWiFiConfig();       CréerSoftAPSucc = CréerWifiSoftAP();       InitalizeHTTPServer();         SetDefaultWiFiConfig();       saveCredentials (en)();        } 
}

Vide InitalizeHTTPServer() 
 {   Bool initok = Faux;   /- Configuration des pages Web: racine, pages config wifi, détecteurs de portails captifs SO et non trouvé. */   Serveur.Sur("/", handleRoot);   Serveur.Sur("/wifi", poignéeWifi);   Serveur.Sur("/filesystem", HTTP_GET,handleDisplayFS);   Serveur.Sur("/téléchargement", HTTP_POST, []() {   Serveur.Envoyer(200, "texte/plaine", "");   }, poignéeFileUpload);    si (MyWiFiConfig.CapPortal) - server.on ("/generate_204", handleRoot); / //Android portail captif. Peut-être pas né cessaire. Peut être manipulé par nonFound gestionnaire.   si (MyWiFiConfig.CapPortal) - server.on ("/favicon.ico", handleRoot);   Un autre portail captif Android. Peut-être pas né cessaire. Peut être manipulé par nonFound gestionnaire. Vérifié sur Sony Handy   si (MyWiFiConfig.CapPortal) - server.on ("/fwlink", handleRoot);  Portail captif Microsoft. Peut-être pas né cessaire. Peut être manipulé par nonFound gestionnaire.   Serveur.Sur("/generate_204", handleRoot);  Portail captif Android. Peut-être pas né cessaire. Peut être manipulé par nonFound gestionnaire.   Serveur.Sur("/favicon.ico", handleRoot);    Un autre portail captif Android. Peut-être pas né cessaire. Peut être manipulé par nonFound gestionnaire. Vérifié sur Sony Handy   Serveur.Sur("/fwlink", handleRoot);   Portail captif Microsoft. Peut-être pas né cessaire. Peut être manipulé par nonFound gestionnaire.    Serveur.onNotFound ( poignéeNotFound );   Speicherung Header-Elemente anfordern   server.collectHeaders(Headers, sizeof(Headers)/ sizeof(Headers[0]);   Serveur.Commencer(); Démarrage du serveur Web
 }

Boolean InitalizeFileSystem() {   Bool initok = Faux;   initok = SPIFFS SPIFFS.Commencer();   Retard(200);   Si (!(initok))   {     Série.println(F("Format SPIFFS"));     SPIFFS SPIFFS.Format();     initok = SPIFFS SPIFFS.Commencer();   }   Retour initok;
}

Boolean CréerWifiSoftAP() 
{   Wifi.Débrancher();   Série.Imprimer(F("Initalize SoftAP"));   Si (MyWiFiConfig (en).PwDReq (en))      {       SoftAccOK (en)  =  Wifi.softAP (softAP)(MyWiFiConfig (en).APSTAName APSTAName, MyWiFiConfig (en).WiFiPwd (WiFiPwd)); Passwortlànge mindestens 8 Zeichen !     } Autre     {       SoftAccOK (en)  =  Wifi.softAP (softAP)(MyWiFiConfig (en).APSTAName APSTAName); Point d’accès sans mot de passe       Fonction de surcharge:; WiFi.softAP (ssid, mot de passe, canal, caché)     }   Retard(2000); Sans délai, j’ai vu l’adresse IP vide   Wifi.softAPConfig (en)(apIP, apIP, netMsk netMsk (en));   Si (SoftAccOK (en))   {   /Configuration du serveur DNS redirigeant tous les domaines vers l’apIP /     dnsServateur.setErrorReplyCode(DNSReplyCode (en)::NoError (NoError));   dnsServateur.Commencer(DNS_PORT, "*", apIP);   Série.println(F("succès.".));   Serial.setDebugOutput (vrai); Debug Sortie pour WLAN sur Serial Interface.   } Autre   {   Série.println(F("Erreur AP soft."));   Série.println(MyWiFiConfig (en).APSTAName APSTAName);   Série.println(MyWiFiConfig (en).WiFiPwd (WiFiPwd));   }   Retour SoftAccOK (en);
}


Octet ConnectWifiAP (en)() 
{   Série.println(F("Initalizing Wifi Client."));     Octet connRes = 0;   Octet  = 0;   Wifi.Débrancher();   Wifi.softAPdisconnect(Vrai); La fonction définira actuellement le SSID configuré et le mot de passe de l’AP soft à des valeurs nulles. Le paramètre est facultatif. Si réglé pour vrai, il va éteindre le mode soft-AP.   Retard(500);     Wifi.Commencer(MyWiFiConfig (en).APSTAName APSTAName, MyWiFiConfig (en).WiFiPwd (WiFiPwd));   connRes  = Wifi.waitForConnectResult();   Tandis que (( connRes == 0 ) Et ( != 10))  si connRes 0 "IDLE_STATUS - changer Statius"     {        connRes  = Wifi.waitForConnectResult();       Retard(2000);       ++;       Série.Imprimer(F("."));       déclaration(s)     }   Tandis que (( connRes == 1 ) Et ( != 10))  si connRes 1 NO_SSID_AVAILin - SSID ne peut être atteint     {        connRes  = Wifi.waitForConnectResult();       Retard(2000);       ++;       Série.Imprimer(F("."));       déclaration(s)     }     Si (connRes == 3 ) {                          Wifi.setAutoReconnect(Vrai); Définissez si le module tentera de se reconnecter à un point d’accès au cas où il serait déconnecté.                         Répondeur MDNS d’installation                             Si (!Mdns.Commencer(ESPHostname ESPHostname)) {                                 Série.println(F("Erreur: MDNS"));                                 } Autre { Mdns.addService("http", "tcp", 80); }                      }   Tandis que (( connRes == 4 ) Et ( != 10))  si connRes 4 Mauvais mot de passe. Parfois, cela se produit avec pwD corrct     {        Wifi.Commencer(MyWiFiConfig (en).APSTAName APSTAName, MyWiFiConfig (en).WiFiPwd (WiFiPwd));        connRes = Wifi.waitForConnectResult();       Retard(3000);       ++;       Série.Imprimer(F("."));                      }   Si (connRes == 4 ) {                           Série.println(F("STA Pwd Err"));                                              Série.println(MyWiFiConfig (en).APSTAName APSTAName);                         Série.println(MyWiFiConfig (en).WiFiPwd (WiFiPwd));                          Wifi.Débrancher();                       }   si (connRes 6 ) - Serial.println ("DISCONNECTED - Not in station mode");   WiFi.printDiag (Serial);
Série.println("");
Retour connRes;
}


#define SD_BUFFER_PIXELS 20


Vide poignéeFileUpload() {                                  Dateien vom Rechnenknecht oder Klingelkasten ins SPIFFS schreiben    Si (Serveur.Uri() != "/téléchargement") Retour;    HTTPUpload (EN)& Télécharger = Serveur.Télécharger();    Si (Télécharger.Statut == UPLOAD_FILE_START) {      String Fichier = Télécharger.Fichier;      Si (Télécharger.Fichier.Longueur() > 30) {       Télécharger.Fichier = Télécharger.Fichier.Sous-chaîne(Télécharger.Fichier.Longueur() - 30, Télécharger.Fichier.Longueur());  Dateinamen auf 30 Zeichen kàrzen     }      Série.println("Nom de fileUpload: " + Télécharger.Fichier);        Si (!Fichier.commenceAvecavec("/")) Fichier = "/" + Fichier;      fsUploadFile - SPIFFS.open (nom de fichier, "w");       fsUploadFile = SPIFFS SPIFFS.Ouvert("/" + Serveur.urlDecode(Télécharger.Fichier), "w");      Fichier = String();    } Autre Si (Télécharger.Statut == UPLOAD_FILE_WRITE) {    Serial.print ("handleFileUpload Data: "); Serial.println (upload.currentSize);      Si (fsUploadFile)        fsUploadFile.Écrire(Télécharger.buf buf, Télécharger.currentSize);    } Autre Si (Télécharger.Statut == UPLOAD_FILE_END) {      Si (fsUploadFile)        fsUploadFile.Proche();      Serial.print ("handleFileUpload Size: "); Serial.println (upload.totalSize);    server.sendContent (Header);      handleDisplayFS();    }
 }



Vide handleDisplayFS() {                     Système de fichiers HTML   Page: /filesystem   Temp ="";   En-tête HTML     Serveur.envoyerHeader("Cache-Contrôle", "no-cache, no-store, must-revalidate");   Serveur.envoyerHeader("Pragma", "no-cache");   Serveur.envoyerHeader("Expires", "-1");   Serveur.setContentLength(CONTENT_LENGTH_UNKNOWN);   Contenu HTML   Serveur.Envoyer ( 200, "texte/html", Temp );    Temp += "Lt;! DOCTYPE HTML-gt;lt;html lang’de’gt;lt;head’lt;lt;meta charset’UTF-8'gt;'lt;meta name''viewport content''width’device-width, initial-scale-1.0,''''''''''''''''''''''''';   Serveur.envoyerContent(Temp);   Temp = "";   Temp += « Type de style de style »'texte/css''''''''lt;!-- DIV.container ' min-height: 10em; affichage: cellule de table; alignez-vous verticalement : milieu de la hauteur : 35px; largeur :90px; font-taille: 16px';   Serveur.envoyerContent(Temp);   Temp = "";   Temp += "corps 'couleur de fond: powderblue;' 'lt;/style 'lt;'lt;head’lt;lt;title 'gt;File System Manager’lt;/title 'lt;/head’gt;";   Temp += "lt;h2 -gt;Serial Peripheral Interface Flash Filesystem-lt;/h2 'lt;body’lt;lt;lt;left’gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Si (Serveur.Args() > 0) Paramètre wurden ubergeben     {       Si (Serveur.hasArg("supprimer"))           {               String FToDel (FToDel) = Serveur.Arg("supprimer");           Si (SPIFFS SPIFFS.Existe(FToDel (FToDel)))               {               SPIFFS SPIFFS.Retirer(FToDel (FToDel));                 Temp += "Fichier" + FToDel (FToDel) + " supprimé avec succès.";             } Autre             {               Temp += "Fichier" + FToDel (FToDel) + "ne peut pas être supprimé.";             }           Serveur.envoyerContent(Temp);           Temp = "";         }       Si (Serveur.hasArg("format") Et Serveur.Arg("sur"))           {              SPIFFS SPIFFS.Format();            Temp += " SYSTÈME de fichiers SPI formaté avec succès.";            Serveur.envoyerContent(Temp);            Temp = "";         } server.client ().stop); L’arrêt est nécessaire parce que nous n’avons envoyé aucune longueur de contenu        }     Temp += "-lt;table border'2 bgcolor ' largeur blanche '400 'gt;'lt;td’lt;lt;h4 'gt;Current SPIFFS Status: 'lt;/h4 'gt;";     Temp += formatBytes(SPIFFS SPIFFS.usedBytes() * 1.05) + " de " + formatBytes(SPIFFS SPIFFS.totalBytes()) + " utilisé. Lt;br’gt;";   Temp += formatBytes((SPIFFS SPIFFS.totalBytes() - (SPIFFS SPIFFS.usedBytes() * 1.05)))+ "gratuit. Lt;br’gt;";   Temp += "Lt;/td’lt;/table’lt;'lt;br’gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Vérifier les paramètres du site    Temp += "-lt;table border'2 bgcolor ' largeur blanche '400 'gt;lt;tr’gt;lt;lt;'lt;'lt;'lt;lt;lt;br’gt;";   Temp += "lt;h4'gt;Available Files on SPIFFS: 'lt;/h4'lt;lt;table border'2 bgcolor 'white 'gt;'lt;/tr’lt;/th 'lt;'lt;td;td’gt;Filename-lt;/td 'gt;'lt;td’gt;Size’lt;/td’lt;td;td;Action 'lt;/td 'lt;/td’lt;/tr’gt;/th’gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Fichier Racine = SPIFFS SPIFFS.Ouvert("/");   Fichier Fichier = Racine.openNextFile();    Tandis que (Fichier)   {      Temp += "Lt;td’gt; 'lt;a title'"Download" href '"" + String(Fichier.Nom()) + "" téléchargement "" + String(Fichier.Nom()) + "\">" + String(Fichier.Nom()) + "Lt;/a’gt; 'lt;br’gt;'lt;/th’gt;";      Temp += "Lt;td’gt;"+ formatBytes(Fichier.Taille())+ "Lt;/td’gt;";      Temp += "Lt;td’gt;lt;a href 'filesystem?delete'" + String(Fichier.Nom()) + "-gt; Supprimer 'lt;/a’lt;/td’gt;";      Temp += "Lt;/tr’gt;lt;/th’gt;";         Fichier = Racine.openNextFile();    }   Temp += "Lt;/tr’gt;lt;/th’gt;";   Temp += "Lt;/td’gt;/tr’gt;/table’lt;/th’lt;br’gt;lt;lt;lt;'lt;/th 'lt;/tr’gt;/table 'gt;/table’gt;/table’gt;'lt;'lt;'lt;'lt;'lt;br’t;br’gt;";   Temp += "-lt;table bordure 2 bgcolor - largeur blanche - 400 'gt;'lt;td’gt;lt;ht;h4 'gt;Upload’lt;/h4 'gt;";     Temp += "Lt;label’gt; Choisissez le fichier: 'lt;/label 'gt;";   Temp += « Méthode de forme »'POST' action'/upload' enctype’multipart/form-data' style 'height:35px;' Le style '35px' de type 'file''''''''' font-taille:13px;' requis 'r’n’lt;type d’entrée ''soumettre' de la valeur ''Upload' classe ''button'''''''lt;/form’gt;";   Temp += " 'lt;/table''lt;br’gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Temp += " 'lt;td’gt;lt;a href 'filesystem?format’on 'gt; Format SPIFFS Filesystem. (Prend jusqu’à 30 secondes) 'lt;/a’lt;/td 'gt;";   Temp += "-lt;table border'2 bgcolor ' largeur blanche '500 cellpadding '5 'gt;'lt;caption’lt;lt;lt;p’lt;lt;h3 'gt;Systemlinks: 'lt;/h2'gt;'lt;/p’lt;/caption 'lt;'lt;lt;tr’gt;lt;lt;'lt;'lt;'lt;'lt;lt;lt;br’gt;";   Temp += " 'lt;a href'/''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''a’t;'lt;/table''lt;br’lt;lt;'lt;'lt;'lt;'lt;'lt;'lt;'lt;'lt;'lt;/th’lt;/tr’lt;/tr’lt;/table''lt;br’lt;'lt;'lt;br’lt;br’gt;'lt;br’gt;'lt;br’gt;'lt;br’gt;'lt;'lt;'lt;'lt;'lt;'lt;'lt;'lt;'lt;/;   Serveur.envoyerContent(Temp);   Temp = "";   Temp += "lt;footer’gt;lt;p’gt;Programd and designed by: Tobias Kuch’lt;/p’lt;p’lt;p’gt;Contact information: 'lt;a href’mailto:tobias.kuch@googlemail.com’gt;tobias.kuch@googlemail.com’lt;/a’gt;lt;/p’lt;/footer’lt;/body’gt;/html’gt;";     server.send ( 200, "", temp );   Serveur.envoyerContent(Temp);   Serveur.Client().Arrêter(); L’arrêt est nécessaire parce que nous n’avons envoyé aucune longueur de contenu   Temp = "";
 }

(- Chargez les informations d’identification WLAN de l’EEPROM /

Bool chargeCredentials() 
{
 Bool RetValue;
 Eeprom.Commencer(512);
 Eeprom.Avoir(0, MyWiFiConfig (en));
 Eeprom.Fin();
 Si (String(MyWiFiConfig (en).ConfigValid) = String("TK"))    {     RetValue = Vrai;   } Autre   {     RetValue = Faux; Paramètres WLAN non trouvés.   }   Retour RetValue;
}


(- Stockez les informations d’identification WLAN à eEPROM /

Bool saveCredentials (en)() 
{
Bool RetValue;
Vérifier les erreurs logiques
RetValue = Vrai;
Si  (MyWiFiConfig (en).APSTA APSTA == Vrai ) AP Mode   {    Si (MyWiFiConfig (en).PwDReq (en) Et (Sizeof(String(MyWiFiConfig (en).WiFiPwd (WiFiPwd))) < 8))     {           RetValue = Faux;  Config invalide     }    Si (Sizeof(String(MyWiFiConfig (en).APSTAName APSTAName)) < 1)     {       RetValue = Faux;  Config invalide     }   } 
Si (RetValue)   {   Eeprom.Commencer(512);   Pour (Int  = 0 ;  < Sizeof(MyWiFiConfig (en)) ; ++)       {       Eeprom.Écrire(, 0);      }   strncpy( MyWiFiConfig (en).ConfigValid , "TK", Sizeof(MyWiFiConfig (en).ConfigValid) );   Eeprom.Mettre(0, MyWiFiConfig (en));   Eeprom.Commettre();   Eeprom.Fin();   }   Retour RetValue;
}


Vide SetDefaultWiFiConfig()
{    Octet Len;    MyWiFiConfig (en).APSTA APSTA = Vrai;    MyWiFiConfig (en).PwDReq (en) = Vrai;  PW par défaut requis    MyWiFiConfig (en).CapPortal (CapPortal) = Vrai;    strncpy( MyWiFiConfig (en).APSTAName APSTAName, "ESP_Config", Sizeof(MyWiFiConfig (en).APSTAName APSTAName) );    Len = Strlen(MyWiFiConfig (en).APSTAName APSTAName);    MyWiFiConfig (en).APSTAName APSTAName[Len+1] = '\0';       strncpy( MyWiFiConfig (en).WiFiPwd (WiFiPwd), "12345678", Sizeof(MyWiFiConfig (en).WiFiPwd (WiFiPwd)) );    Len = Strlen(MyWiFiConfig (en).WiFiPwd (WiFiPwd));    MyWiFiConfig (en).WiFiPwd (WiFiPwd)[Len+1] = '\0';      strncpy( MyWiFiConfig (en).ConfigValid, "TK", Sizeof(MyWiFiConfig (en).ConfigValid) );    Len = Strlen(MyWiFiConfig (en).ConfigValid);    MyWiFiConfig (en).ConfigValid[Len+1] = '\0';     Série.println(F("Reset WiFi Credentials.")); 
}



Vide handleRoot() {
Page principale:
 Temp = "";
 Octet PicCompte = 0;
 Octet ServArgs = 0;   En-tête HTML   Serveur.envoyerHeader("Cache-Contrôle", "no-cache, no-store, must-revalidate");   Serveur.envoyerHeader("Pragma", "no-cache");   Serveur.envoyerHeader("Expires", "-1");   Serveur.setContentLength(CONTENT_LENGTH_UNKNOWN);
Contenu HTML   Serveur.Envoyer ( 200, "texte/html", Temp );   Speichersparen - Schon mal dem Cleint senden   Temp = "";   Temp += "Lt;! DOCTYPE HTML-gt;lt;html lang’de’gt;lt;head’lt;lt;meta charset’UTF-8'gt;'lt;meta name''viewport content''width’device-width, initial-scale-1.0,''''''''''''''''''''''''';   Serveur.envoyerContent(Temp);   Temp = "";   Temp += « Type de style de style »'texte/css''''''''lt;!-- DIV.container ' min-height: 10em; affichage: cellule de table; alignez-vous verticalement : milieu de la hauteur : 35px; largeur :90px; font-taille: 16px';   Serveur.envoyerContent(Temp);   Temp = "";   Temp += "corps 'couleur de fond: powderblue;' Lt;/style 'gt;";   Temp += "lt;head’lt;lt;title 'gt;Hauptseite’lt;/title 'lt;/head’gt;";   Temp += "lt;h2'gt;Hauptseite’lt;/h2'gt;";   Temp += "Lt;body’gt;";   Serveur.envoyerContent(Temp);   Temp = ""; 
Traitement de la demande d’utilisateur   Temp = "";    Temp += "-lt;table border'2 bgcolor - largeur blanche ' 500 cellpadding '5 'gt;'lt;caption’lt;lt;p’lt;p’lt;h3 'gt;Systemlinks:'lt;/h2 'gt;/p’gt;/caption 'gt;";   Temp += "Lt;tr’gt;lt;lt;lt;lt;lt;br’gt;";   Temp += "'lt;a href'/wifi'''wifi'''wiFI''wiFI Einstellungen’lt;/a’lt;br’gt;lt;lt;br’gt;br’gt;";   Temp += "'lt;a href'/filesystem'''''gt;Filemanager’lt;/a’lt;br’gt;lt;lt;br’t;br’gt;";   Temp += "Lt;/th’lt;/tr’gt;/table’t;'lt;'lt;br’gt;lt;br’lt;lt;br’t;br’gt;";   Temp += "lt;footer’gt;lt;p’er;Programmed and designed by: Tobias Kuch-lt;/p’lt;p’lt;p’gt;Contact information: 'lt;a href’mailto:tobias.kuch@googlemail.com’gt;tobias.kuch@googlemail.com’lt;/a’gt;;/p’lt;/p’gt;/p’lt;/p’lt;/p’lt;/p’lt;;p.;   Temp += "Lt;/corps 'lt;/html’gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Serveur.Client().Arrêter(); L’arrêt est nécessaire parce que nous n’avons envoyé aucune longueur de contenu
}



Vide poignéeNotFound() {      Si (captivePortal())        { Si caprive portail rediriger au lieu d’afficher la page d’erreur.         Retour;       }     Si (!handleFileRead(Serveur.Uri()))      {     Temp = "";      En-tête HTML     Serveur.envoyerHeader("Cache-Contrôle", "no-cache, no-store, must-revalidate");     Serveur.envoyerHeader("Pragma", "no-cache");     Serveur.envoyerHeader("Expires", "-1");     Serveur.setContentLength(CONTENT_LENGTH_UNKNOWN);     Contenu HTML     Temp += "Lt;! DOCTYPE HTML-gt;lt;html lang’de’gt;lt;head’lt;lt;meta charset’UTF-8'gt;'lt;meta name''viewport content''width’device-width, initial-scale-1.0,''''''''''''''''''''''''';     Temp += « Type de style de style »'texte/css''''''''lt;!-- DIV.container ' min-height: 10em; affichage: cellule de table; alignez-vous verticalement : milieu de la hauteur : 35px; largeur :90px; font-taille: 16px';     Temp += "corps 'couleur de fond: powderblue;' Lt;/style 'gt;";     Temp += "lt;head’lt;lt;title’gt;File not found’lt;/title’lt;/head’gt;";     Temp += "lt;h2'gt; 404 File Not Found’lt;/h2 'lt;lt;br’gt;";     Temp += "Lt;h4-gt;Debug Information: 'lt;/h4 'lt;lt;br’gt;";     Temp += "Lt;body’gt;";     Temp += "URI: ";     Temp += Serveur.Uri();     Temp += "NMethod: ";     Temp+= ( Serveur.Méthode() == HTTP_GET ) ? "GET" : "POST";     Temp += "Lt;br’gt;Arguments: ";     Temp += Serveur.Args();     Temp += "N";       Pour ( uint8_t  = 0;  < Serveur.Args(); ++ ) {         Temp += " " + Serveur.argName argName (  ) + ": " + Serveur.Arg (  ) + "N";         }     Temp += "Lt;br’gt;Server Hostheader: "+ Serveur.hostHeader (en)();     Pour ( uint8_t  = 0;  < Serveur.En-têtes(); ++ ) {         Temp += " " + Serveur.headerName (  ) + ": " + Serveur.En-tête (  ) + "N’lt;br’gt;";         }       Temp += "Lt;/table 'gt;'lt;/form’lt;br’gt;lt;lt;br’lt;br’lt;lt;lt;table border'2 bgcolor ' largeur blanche '500 cellpadding '5 'gt;gt;-lt;caption 'lt;'lt;p’lt;lt;h2 'gt;Vous voudrez peut-être naviguer à: 'lt;/h2'lt;/p 'gt;/caption 'gt;/caption 'gt;";     Temp += "Lt;tr’gt;lt;lt;'";     Temp += "Lt;a href'/'gt;Main Page’lt;/a’lt;lt;br’gt;";     Temp += "Lt;a href'/wifi''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';     Temp += "'lt;a href'/filesystem'''''gt;Filemanager’lt;/a’lt;br’gt;";     Temp += "Lt;/th’lt;/tr’gt;/table’t;'lt;'lt;br’gt;lt;br’lt;lt;br’t;br’gt;";     Temp += "lt;footer’gt;lt;p’er;Programmed and designed by: Tobias Kuch-lt;/p’lt;p’lt;p’gt;Contact information: 'lt;a href’mailto:tobias.kuch@googlemail.com’gt;tobias.kuch@googlemail.com’lt;/a’gt;;/p’lt;/p’gt;/p’lt;/p’lt;/p’lt;/p’lt;;p.;     Temp += "Lt;/corps 'lt;/html’gt;";     Serveur.Envoyer ( 404, "", Temp );     Serveur.Client().Arrêter(); L’arrêt est nécessaire parce que nous n’avons envoyé aucune longueur de contenu     Temp = "";     }
}




Réorienter vers le portail captif si nous avons reçu une demande pour un autre domaine. Rendement vrai dans ce cas afin que le gestionnaire de page n’essayez pas de gérer la demande à nouveau. */
Boolean captivePortal() {   Si (!Isip(Serveur.hostHeader (en)()) && Serveur.hostHeader (en)() != (String(ESPHostname ESPHostname)+".local")) {     Serial.println ("Request redirected to captive portal");       Serveur.envoyerHeader("Emplacement", String("http://") + toStringIp(Serveur.Client().localIP()), Vrai);     Serveur.Envoyer ( 302, "texte/plaine", ""); Le contenu vide inhibe l’en-tête de longueur de contenu ainsi nous devons fermer la prise nous-mêmes.     Serveur.Client().Arrêter(); L’arrêt est nécessaire parce que nous n’avons envoyé aucune longueur de contenu     Retour Vrai;   }   Retour Faux;
}
 


/- Wifi config page gestionnaire /
Vide poignéeWifi() 
 {   Page: /wifi   Octet ;   Octet Len ;   Temp = "";   Vérifier les paramètres du site         Si (Serveur.hasArg("Reboot") )  Système de redémarrage         {          Temp = "Système de redémarrage en 5 secondes.";          Serveur.Envoyer ( 200, "texte/html", Temp );          Retard(5000);          Serveur.Client().Arrêter();                Wifi.Débrancher();          Retard(1000);              }       Si (Serveur.hasArg("WiFiMode") Et (Serveur.Arg("WiFiMode") == "1")  )  Mode station STA Connectez-vous à une autre station WIFI          {         startMillis = Millis(); Reset Time Up Counter pour éviter l’exploitation du whiole en mode ralenti         Connectez-vous à STATION existante         Si ( Sizeof(Serveur.Arg("WiFi_Network")) > 0  )           {             Série.println("Mode STA");             MyWiFiConfig (en).APSTA APSTA = Faux; Mode point d’accès ou station - faux mode de gare             Temp = "";                       Pour (  = 0;  < APSTANameLen;++) { MyWiFiConfig (en).APSTAName APSTAName[] =  0; }             Temp = Serveur.Arg("WiFi_Network");             Len =  Temp.Longueur();             Pour (  = 0;  < Len;++)              {                    MyWiFiConfig (en).APSTAName APSTAName[] =  Temp[];                           }             Temp = "";             Pour (  = 0;  < WiFiPwdLen (WiFiPwdLen);++)  { MyWiFiConfig (en).WiFiPwd (WiFiPwd)[] =  0; }                       Temp = Serveur.Arg("STAWLanPW");             Len =  Temp.Longueur();                                  Pour (  = 0;  < Len;++)                 {                  Si (Temp[] > 32) Steuerzeichen raus                   {                    MyWiFiConfig (en).WiFiPwd (WiFiPwd)[] =  Temp[];                     }                 }             Temp = "WiFi Connect à AP: -";              Temp += MyWiFiConfig (en).APSTAName APSTAName;             Temp += "-lt;br’gt;WiFi PW: -";              Temp += MyWiFiConfig (en).WiFiPwd (WiFiPwd);             Temp += "-lt;br’gt;";                       Temp += "Connexion au mode STA en 2 secondes. Lt;br’gt;";             Serveur.Envoyer ( 200, "texte/html", Temp );              Serveur.envoyerContent(Temp);             Retard(2000);             Serveur.Client().Arrêter();              Serveur.Arrêter();             Temp = "";             Wifi.Débrancher();             Wifi.softAPdisconnect(Vrai);             Retard(500);            ConnectWifiAP (en)            Bool SaveOk (SaveOk) = saveCredentials (en)();                        = ConnectWifiAP (en)();             Retard(700);             Si ( != 3) 4: WL_CONNECT_FAILED - Mot de passe est incorrect 1: WL_NO_SSID_AVAILin - SSID configuré ne peut pas être atteint               {                  Série.Imprimer(F(" Ne peut pas se connecter à un réseau spécifié. Motif: "));                  Série.println();                  Serveur.Client().Arrêter();                  Retard(100);                               Wifi.setAutoReconnect (Faux);                  Retard(100);                       Wifi.Débrancher();                               Retard(1000);                  SetDefaultWiFiConfig();                  CréerWifiSoftAP();                  Retour;                } Autre               {                  Config sûr                  Bool SaveOk (SaveOk) = saveCredentials (en)();                  InitalizeHTTPServer();                  Retour;               }           }        }                 Si (Serveur.hasArg("WiFiMode") Et (Serveur.Arg("WiFiMode") == "2")  )  Modifier le mode AP         {         startMillis = Millis(); Reset Time Up Counter pour éviter l’exploitation du whiole en mode ralenti         Configurer le point d’accès         Temp = Serveur.Arg("APPointName");               Len =  Temp.Longueur();         Temp =Serveur.Arg("APPW");         Si (Serveur.hasArg("PasswordReq"))             {                      =  Temp.Longueur();             } Autre {  = 8; }                  Si (  ( Len > 1 ) Et (Serveur.Arg("APPW") == Serveur.Arg("APPWRepeat")) Et (  > 7)          )           {             Temp = "";             Série.println(F("APMode"));             MyWiFiConfig (en).APSTA APSTA = Vrai; Point d’accès ou mode Sation - vrai mode AP                                     Si (Serveur.hasArg("CaptivePortal"))             {               MyWiFiConfig (en).CapPortal (CapPortal) = Vrai ; CaptivePortal en mode AP             } Autre { MyWiFiConfig (en).CapPortal (CapPortal) = Faux ; }                          Si (Serveur.hasArg("PasswordReq"))             {               MyWiFiConfig (en).PwDReq (en) = Vrai ; Mot de passe requis en mode AP             } Autre { MyWiFiConfig (en).PwDReq (en) = Faux ; }             Pour (  = 0;  < APSTANameLen;++) { MyWiFiConfig (en).APSTAName APSTAName[] =  0; }             Temp = Serveur.Arg("APPointName");             Len =  Temp.Longueur();             Pour (  = 0;  < Len;++) { MyWiFiConfig (en).APSTAName APSTAName[] =  Temp[]; }             MyWiFiConfig (en).APSTAName APSTAName[Len+1] = '\0';               Temp = "";             Pour (  = 0;  < WiFiPwdLen (WiFiPwdLen);++)  {  MyWiFiConfig (en).WiFiPwd (WiFiPwd)[] =  0; }                       Temp = Serveur.Arg("APPW");             Len =  Temp.Longueur();                                  Pour (  = 0;  < Len;++)  { MyWiFiConfig (en).WiFiPwd (WiFiPwd)[] =  Temp[];  }             MyWiFiConfig (en).WiFiPwd (WiFiPwd)[Len+1] = '\0';               Temp = "";                      Si (saveCredentials (en)()) Enregistrer AP ConfigCongfig                 {                         Temp = "Daten des AP Modes erfolgreich gespeichert. Redémarrer notwendig.";               } Autre  { Temp = "Daten des AP Modes fehlerhaft.";  }           } Autre Si (Serveur.Arg("APPW") != Serveur.Arg("APPWRepeat"))                 {                   Temp = "";                   Temp = "WLAN Passwort nicht gleich. Abgebrochen.;                 } Autre                 {                               Temp = "";                   Temp = "WLAN Passwort oder AP Nom zu kurz. Abgebrochen.;                 }                                        }      En-tête HTML   Serveur.envoyerHeader("Cache-Contrôle", "no-cache, no-store, must-revalidate");   Serveur.envoyerHeader("Pragma", "no-cache");   Serveur.envoyerHeader("Expires", "-1");   Serveur.setContentLength(CONTENT_LENGTH_UNKNOWN);
Contenu HTML   Temp += "Lt;! DOCTYPE HTML-gt;lt;html lang’de’gt;lt;head’lt;lt;meta charset’UTF-8'gt;'lt;meta name''viewport content''width’device-width, initial-scale-1.0,''''''''''''''''''''''''';   Serveur.Envoyer ( 200, "texte/html", Temp );    Temp = "";    Temp += « Type de style de style »'texte/css''''''''lt;!-- DIV.container ' min-height: 10em; affichage: cellule de table; alignez-vous verticalement : milieu de la hauteur : 35px; largeur :90px; font-taille: 16px';   Temp += "corps 'couleur de fond: powderblue;' 'lt;/style 'gt;'lt;'lt;head;'lt;title 'gt;Smartes Tuerschild - WiFi Settings’lt;/title 'gt;'lt;/head’gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Temp += "lt;h2 'gt;WiFi Einstellungen’lt;/h2 'lt;body’lt;lt;lt;left’gt;";   Temp += "-lt;table border'2 bgcolor ' largeur blanche '500 'gt;'lt;td’gt;lt;h4 'gt;Current WiFi Paramètres: 'lt;/h4 'gt;";   Si (Serveur.Client().localIP() == apIP) {      Temp += "Mode : Soft Access Point (AP)-lt;br-gt;";      Temp += "SSID : " + String (MyWiFiConfig (en).APSTAName APSTAName) + "Lt;br’gt;lt;br’gt;";   } Autre {      Temp += "Mode : Station (STA) 'lt;br’gt;";      Temp += "SSID : "+ String (MyWiFiConfig (en).APSTAName APSTAName) + "Lt;br’gt;";      Temp += "BSSID : " + Wifi.BSSIDstr()+ "Lt;br’gt;lt;br’gt;";   }   Temp += "Lt;/td’lt;/table’lt;'lt;br’gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Temp += Méthode d’action'/wifi''post'''post'''";   Temp += "-lt;table border'2 bgcolor ' largeur blanche '500 'gt;'lt;tr’gt;lt;lt;lt;'lt;'lt;lt;lt;br’gt;";   Si (MyWiFiConfig (en).APSTA APSTA == 1)     {       Temp += " 'lt;input type’radio' value''1' name’WiFiMode' ''wiFiMode' 'gt; WiFi Station Mode’lt;br’gt;";     } Autre     {       Temp += "'lt;input type' 'radio' value''1' name’WiFiMode' checked 'gt; WiFi Station Mode’lt;br’gt;";     }   Temp += "Réseaux WiFi disponibles: 'lt;table border'2 bgcolor 'blanc 'gt;'lt;/tr’gt;'lt;/th’lt;/th’lt;td;Td’gt;Number 'lt;/td’gt;'l td;SSID -lt;/td 'lt;'lt;td;Encryption 'lt;/td’gt;/td’lt;'lt;td;td;td’gt;WiFi Strength 'lt;/td 'gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Wifi.scanDelete();   Int ¡n = Wifi.scanNetworks (scanNetworks)(Faux, Faux); WiFi.scanNetworks (async, show_hidden)   Si (¡n > 0) {     Pour (Int  = 0;  < ¡n; ++) {     Temp += "Lt;/tr’gt;lt;/th’gt;";     String Nrb = String();     Temp += "Lt;td’gt;" + Nrb + "Lt;/td’gt;";     Temp += "Lt;td’gt;" + Wifi.Ssid() +"Lt;/td’gt;";         Nrb = GetEncryptionType(Wifi.cryptageType());     Temp += "Lt;td’gt;"+ Nrb + "Lt;/td’gt;";     Temp += "Lt;td’gt;" + String(Wifi.RSSI RSSI()) + "Lt;/td’gt;";        }   } Autre {     Temp += "Lt;/tr’gt;lt;/th’gt;";     Temp += "Lt;td’gt;1 'lt;/td’gt;";     Temp += "Lt;td’gt;No WLAN trouvé’lt;/td’gt;";     Temp += "Lt;td’gt; --- 'lt;/td’gt;";     Temp += "Lt;td’gt; --- 'lt;/td’gt;";   }   Temp += "-lt;/table 'gt;'lt;lt;table border'2 bgcolor 'blanc 'gt;'lt;/tr’lt;/th’lt;'lt;'lt;t’lt;td’td’gt;Connect to WiFi SSID: 'lt;/td’lt;td;td;td;td;'lt;'s select name’WiFi_Network’a;
Si (¡n > 0) {     Pour (Int  = 0;  < ¡n; ++) {     Temp += " Valeur d’option '" + Wifi.Ssid() +"'>" + Wifi.Ssid() +"Lt;/option’gt;";           }   } Autre {     Temp += "Lt;option value’No_WiFi_Network''no WiFiNetwork trouvé !/option 'gt;";   }   Serveur.envoyerContent(Temp);   Temp = "";   Temp += "Lt;/select’gt;/td’lt;/tr’lt;/tr’gt;/th’lt;/th’lt;/tr’lt;/tr’lt;/th 'lt;'lt;Tt;td’gt;WiFi Password: 'lt;/td’gt;'lt;td;gt;td;gt;';   Temp += « Type d’entrée »texte' nom 'STAWLanPW' maxlength''40' size''40'gt;";    Temp += "Lt;/td’lt;/tr’gt;/lt;/th’lt;'lt;'lt;br’gt;'lt;/th’lt;/th’lt;/tr’gt;lt;/table -gt;/table 'gt;'lt;lt;lat;table border'2 bgcolor ' largeur blanche '500 'gt;'lt;tr’gt;lt;'lt;'lt;'lt;'lt;br’gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Si (MyWiFiConfig (en).APSTA APSTA == Vrai)     {       Temp += " 'lt;input type' name''WiFiMode' value''2' checked’gt; WiFi Access Point Mode 'lt;br’gt;";     } Autre     {       Temp += " 'lt;input type’radio' name''WiFiMode' value''2' ''gt; WiFi Access Point Mode 'lt;br’gt;";     }   Temp += "-lt;table border'2 bgcolor ' blanc 'gt;'lt;/tr’gt;'lt;/th’gt; 'lt;td’gt; 'lt;td’gt;WiFi Access Point Name: 'lt;/td’gt;'lt;td’gt;";     Serveur.envoyerContent(Temp);   Temp = "";               Si (MyWiFiConfig (en).APSTA APSTA == Vrai)     {       Temp += «Lt;input type’texte' nom 'APPointName' maxlength'"+String(APSTANameLen-1)+"'taille'30' valeur'" + String(MyWiFiConfig (en).APSTAName APSTAName) + "''''lt;/td’gt;";     } Autre     {       Temp += «Lt;input type’texte' nom 'APPointName' maxlength'"+String(APSTANameLen-1)+"' taille'30' 'gt;'lt;/td’gt;";     }   Serveur.envoyerContent(Temp);   Temp = "";          Si (MyWiFiConfig (en).APSTA APSTA == Vrai)     {       Temp += "Lt;/tr’gt;lt;/th 'lt;'lt;td’gt;WiFi Password: 'lt;/td’gt;lt;td;td;td;td’gt;";       Temp += " ''APPW' maxlength'"+String(WiFiPwdLen (WiFiPwdLen)-1)+"'taille'30' valeur'" + String(MyWiFiConfig (en).WiFiPwd (WiFiPwd)) + "'gt; 'lt;/td 'gt;";       Temp += "Lt;/tr’gt;lt;/th 'lt;'lt;td’gt;Repeat WiFi Password: 'lt;/td 'gt;";       Temp += «Lt;td’gt;lt;lt;type d’entrée type 'password' nom 'APPWRepeat' maxlength'"+String(WiFiPwdLen (WiFiPwdLen)-1)+"'taille'30' valeur'" + String(MyWiFiConfig (en).WiFiPwd (WiFiPwd)) + "'gt; 'lt;/td 'gt;";     } Autre     {       Temp += "Lt;/tr’gt;lt;/th 'lt;'lt;td’gt;WiFi Password: 'lt;/td’gt;lt;td;td;td;td’gt;";       Temp += " ''APPW' maxlength'"+String(WiFiPwdLen (WiFiPwdLen)-1)+"' taille'30'gt; 'lt;/td’gt;";       Temp += "Lt;/tr’gt;lt;/th 'lt;'lt;td’gt;Repeat WiFi Password: 'lt;/td 'gt;";       Temp += «Lt;td’gt;lt;lt;type d’entrée type 'password' nom 'APPWRepeat' maxlength'"+String(WiFiPwdLen (WiFiPwdLen)-1)+"' taille'30'gt; 'lt;/td’gt;";     }       Temp += "Lt;/table’gt;";   Serveur.envoyerContent(Temp);   Temp = "";         Si (MyWiFiConfig (en).PwDReq (en))     {       Temp += "Le nom de la boîte à contrôle''passwordReq' a vérifié le mot de passe pour Login. ";      } Autre     {       Temp += "Le nom de la boîte à contrôle''passwordReq' 'lt;input type''checkbox' ''PasswordReq' ''''' ''' '' '';      }   Serveur.envoyerContent(Temp);   Temp = "";     Si (MyWiFiConfig (en).CapPortal (CapPortal))     {       Temp += " 'lt;input type’checkbox' name’CaptivePortal' checked’gt; Activate Captive Portal";      } Autre     {       Temp += Nom de la boîte à contrôle 'CaptivePortal' ''''''''Ant;'input type’checkbox' ''CaptivePortal' ''Activate Captive Portal';      }   Serveur.envoyerContent(Temp);   Temp = "";     Temp += "lt;br’gt;/tr’lt;/th’lt;/th’lt;/table’lt;'lt;'lt;br’gt; 'lt;lt;lt;br’gt; 'lt;button type''submit' name''Settings' value''1' style’height: 50px; largeur: 140px' autofocus 'gt;Set WiFi Settings’lt;/button 'gt;";   Temp += « Le type de bouton » « soumettre » le nom de 'Reboot' 'valeur''1' style’height: 50px; largeur: 200px' 'gt;Reboot System’lt;/button’gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Temp += « Le type de bouton » ' 'reset' name''action' value''1' style’height: 50px; largeur: 100px' 'gt;Reset’lt;/button 'lt;/form’gt;";   Temp += "-lt;table border'2 bgcolor ' largeur blanche '500 cellpadding '5 'gt;'lt;caption’lt;lt;lt;p’lt;lt;h3 'gt;Systemlinks: 'lt;/h2'gt;'lt;/p’lt;/caption 'lt;'lt;lt;tr’gt;lt;lt;'lt;'lt;'lt;'lt;lt;lt;br’gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Temp += "-lt;a href'/'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''a’s’est ado’lt;/a’t;/table'',lt;br’lt;lt;'lt;'lt;'lt;'lt;'lt;'lt;'lt;/'lt;/'lt;'lt;/'lt;'lt;/'t;'lt;/tr’gt;/table''t;'lt;br’gt;lt;'lt;br’lt;br’t;br’gt;'lt;'t;br’gt;';   temp ''lt;footer’gt;lt;p’gt;Programd and designed by: Tobias Kuch’lt;/p’lt;lt;p’lt;p’gt;Contact information: 'lt;a href 'mailto:tobias.kuch@googlemail.com''gt;tobias.kuch@googlemail.com’lt;/a’gt;.lt;/p’gt;/footer’gt;";   Temp += "Lt;/corps 'lt;/html’gt;";     Serveur.envoyerContent(Temp);   Serveur.Client().Arrêter(); L’arrêt est nécessaire parce que nous n’avons envoyé aucune longueur de contenu   Temp = "";
}


Vide poignéeUploadSave() 
{   String FileData (en) ;     Temp = "";   server.send(200);   Serial.println ("FileUpload");   Serial.println (server.args);               Pour (Octet  = 0;  < Serveur.Args(); ++)    {     Temp += "Arg " + (String) + " –> ";   Inclure la valeur actuelle d’itération     Temp += Serveur.argName argName() + ": ";     Obtenir le nom du paramètre     Temp += Serveur.Arg() + "N";              Obtenez la valeur du paramètre   }    server.send(200, "texte/plaine", temp);       Réponse à la demande HTTP   FileData (en) = Serveur.Arg("datei");    Serveur.envoyerHeader("Emplacement", "filesystem", Vrai);   Serveur.envoyerHeader("Cache-Contrôle", "no-cache, no-store, must-revalidate");   Serveur.envoyerHeader("Pragma", "no-cache");   Serveur.envoyerHeader("Expires", "-1");   Serveur.Envoyer ( 302, "texte/plaine", "");  Le contenu vide inhibe l’en-tête de longueur de contenu ainsi nous devons fermer la prise nous-mêmes.   Serveur.Client().Arrêter(); L’arrêt est nécessaire parce que nous n’avons envoyé aucune longueur de contenu  
}


C’est une adresse IP ? */
Boolean Isip(String Str) {   Pour (Int  = 0;  < Str.Longueur(); ++) {     Int C = Str.charAt();     Si (C != '.' && (C < '0' || C > '9')) {       Retour Faux;     }   }   Retour Vrai;
}

String GetEncryptionType(Octet ceType) {   String Sortie = "";    lire le type de chiffrement et imprimer le nom:    Interrupteur (ceType) {      Cas 5:        Sortie = "WEP";        Retour Sortie;        Pause;      Cas 2:        Sortie = "WPA";        Retour Sortie;        Pause;      Cas 4:        Sortie = "WPA2";        Retour Sortie;        Pause;      Cas 7:        Sortie = "Aucun";        Retour Sortie;        Pause;      Cas 8:        Sortie = "Auto";        Retour Sortie;       Pause;    }
}

TU t’enchaînes ? */
String toStringIp(Ipaddress Ip) {   String Res = "";   Pour (Int  = 0;  < 3; ++) {     Res += String((Ip >> (8 * )) & 0xff) + ".";   }   Res += String(((Ip >> 8 * 3)) & 0xff);   Retour Res;
}

String formatBytes(Size_t Octets) {            lesbare Anzeige der Speichergràen    Si (Octets < 1024) {      Retour String(Octets) + "Byte";    } Autre Si (Octets < (1024 * 1024)) {      Retour String(Octets / 1024.0) + " KB ";    } Autre Si (Octets < (1024 * 1024 * 1024)) {      Retour String(Octets / 1024.0 / 1024.0) + " Mb ";    }
 }

String getContentType(String Fichier) { convertir l’extension du fichier au type MIME   Si (Fichier.se termineAvec(".htm")) Retour "texte/html";   Autre Si (Fichier.se termineAvec(".css")) Retour "texte/css";   Autre Si (Fichier.se termineAvec(".js")) Retour "application/javascript";   Autre Si (Fichier.se termineAvec(".ico")) Retour "image/x-icon";   Autre Si (Fichier.se termineAvec(".gz")) Retour "application/x-gzip";   Autre Si (Fichier.se termineAvec(".bmp")) Retour "image/bmp";   Autre Si (Fichier.se termineAvec(".tif")) Retour "image/tiff";   Autre Si (Fichier.se termineAvec(".pbm")) Retour "image/x-portable-bitmap";   Autre Si (Fichier.se termineAvec(".jpg")) Retour "image/jpeg";   Autre Si (Fichier.se termineAvec(".gif")) Retour "image/gif";   Autre Si (Fichier.se termineAvec(".png")) Retour "image/png";   Autre Si (Fichier.se termineAvec(".svg")) Retour "image/svg xml";   Autre Si (Fichier.se termineAvec(".html")) Retour "texte/html";   Autre Si (Fichier.se termineAvec(".wav")) Retour "audio/x-wav";   Autre Si (Fichier.se termineAvec(".zip")) Retour "application/zip";   Autre Si (Fichier.se termineAvec(".rgb")) Retour "image/x-rg";
 Liste complète sur https://wiki.selfhtml.org/wiki/MIME-Type/Bersicht   Retour "texte/plaine";
}

Bool handleFileRead(String Chemin) { envoyer le bon fichier au client (s’il existe)
Serial.println ("handleFileRead: " et chemin);   Si (Chemin.se termineAvec("/")) Chemin += "index.html";          Si un dossier est demandé, envoyez le fichier index   String Contenttype = getContentType(Chemin);             Obtenez le type MIME   String cheminWithGz = Chemin + ".gz";   Si (SPIFFS SPIFFS.Existe(cheminWithGz) || SPIFFS SPIFFS.Existe(Chemin)) { Si le fichier existe, soit comme une archive compressée, ou     Si (SPIFFS SPIFFS.Existe(cheminWithGz))                         S’il y a une version compressée disponible       Chemin += ".gz";                                         Utilisez la verion comprimée     Fichier Fichier = SPIFFS SPIFFS.Ouvert(Chemin, "r");                    Ouvrez le fichier     Size_t Envoyé = Serveur.streamFile streamFile(Fichier, Contenttype);    Envoyez-le au client     Fichier.Proche();                                          Fermez à nouveau le fichier     Retour Vrai;   }   Retour Faux;
}

Vide Boucle() 
 {     Si (SoftAccOK (en))   {     dnsServateur.processusNextRequest(); Dns   }   HTTP (en)   Serveur.handleClient();     }

]

 

Je vous souhaite beaucoup de plaisir avec le serveur de fichiers sur l’ESP32. Dans la prochaine partie, nous allons examiner comment la sortie des images BMP stockées sur le serveur de fichiers sur les écrans LED Matrix.

Jusqu’à la prochaine fois !

Esp-8266Projekte für fortgeschrittene

5 commentaires

Eberhard

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

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.

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Articles de blog recommandés

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery