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 !
5 commentaires
Eberhard
Hallo
heute war ich auf das Captive portal für den ESP8266 gestoßen. Gleich gemacht – und es funktioniert prächtig. Danke für diese Anweisungen.
Nun will ich auch nen Fileserver auf den EWP8266 installieren – das geht aber leider nicht mit dieser Anweisung hier.
Frage: wie kann ich zum Captive portal auf dem ESP8266 einen Fileserver installieren?
Danke im Voraus
Hardy
Tobias
Hallo Sven,
Tausche bitte die Zeile
if (String(MyWiFiConfig.ConfigValid) = String(“TK”)) durch if (String(MyWiFiConfig.ConfigValid) == String(“TK”)) aus. Dann sollte es funktionieren. Leider konnte ich den Fehler erst in Teil 4 der Reihe korrigieren..
Gruß
Peter Pitzeier
Die consts
static const byte WiFiPwdLen = 25;
static const byte APSTANameLen = 20;
sind u.U. nicht ausreichend. Ein WiFi password darf bis zu 63, der Name eines APs max. 32 Zeichen lang sein.
Sven
Also, kompilieren hat ohne Probleme funktioniert, auch das Hochladen. Aber, der Name ESP32 erscheint auf dem Handy nicht, nur ESP_?? und mit dem Passwort kann man sich nicht verbinden. Habe den Namen geändert, hat aber auch nicht geklappt. Ich finde die Idee sehr gut, nur wie klappt es trotzdem? Ich habe auch schon andere Handys probiert, ohne Erfolg. Wäre dankbar für eine Hilfe.
Peter Pitzeier
Wie in den Teilen 1 und 2 steht in bool loadCredentials()
if (String(MyWiFiConfig.ConfigValid) = String(“TK”))
Das kann doch wohl nicht richtig sein, oder? Wenn kein Vergleich mittels ‘==’ , sondern eine Zuweisung ‘=’ erfolgt, wird das ‘if’ immer wahr und damit sinnlos sein.