Eigenes Captive Portal mit dem ESP 8266 (Teil 1) - AZ-Delivery

Bonjour et bienvenue sur un blog spécial:

 

Aujourd’hui, il ne devrait pas s’agir d’un projet terminé, mais d’aider beaucoup de vos propres projets autour du sujet des données d’accès WLAN et ESP8266. Souvent, le problème existe avec de propres projets, les données d’accès WLAN sont programmées en permanence dans votre propre code, mais ne peuvent plus être modifiées par la suite ou l’ESP "oublie" ses données d’accès WLAN dès qu’un redémarrage a lieu. Les deux sont problématiques pour une certaine flexibilité de configuration. La solution pour cela est de stocker les données d’accès WLAN dans l’EEPROM interne et de s’assurer que ceux-ci peuvent être changés à tout moment, même à la durée du firmware.

À cette fin, l’ESP utilise notre code portail captif suivant comme première étape Portail captif Wi-Fi avec le nom "My_WLANDevice" et le mot de passe "12345678". Avec cela, nous pouvons nous connecter à notre téléphone mobile, et sont ensuite automatiquement dirigés à partir du téléphone mobile vers le site Web De Portail Captif. Cela ressemble à ceci:

 

Portail captif

 

Sur ce, nous pouvons maintenant cliquer sur le lien système "WiFi Paramètres" et maintenant nous arrivons à une page de configuration WLAN complète, avec laquelle nous pouvons maintenant sélectionner à la fois un réseau avec lequel l’ESP devrait se connecter:

 

Portail captif - WiFi Installe

 

Le réseau sans fil sélectionné ici et le mot de passe saisi sont stockés dans l’EEPROM. Sur le bateau suivant, l’ESP tente de se connecter à ce réseau. Si la tentative échoue parce que le réseau n’est plus accessible, par exemple, ou que le mot de passe a été modifié, l’ESP retourne en mode point d’accès et attend une reconfiguration.

Le code du Portail Captif est :

 

 

#include <ESP8266WiFi.H (en)>
#include <WiFiClient (WiFiClient).H (en)>
#include <ESP8266WebServateur.H (en)>
#include <ESP8266mDNS ESP8266mDNS.H (en)>
#include <DNSServateur.H (en)>
#include <Eeprom.H (en)>

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

Statique Const uint8_t D0 D0   = 16;
Statique Const uint8_t D1 D1   = 5;
Statique Const uint8_t D2 D2   = 4;
Statique Const uint8_t D3 D3   = 0;
Statique Const uint8_t D4 D4   = 2;
Statique Const uint8_t D5 D5   = 14;
Statique Const uint8_t D6 D6   = 12;
Statique Const uint8_t D7 D7   = 13;
Statique Const uint8_t D8   = 15;
Statique Const uint8_t D9 D9   = 3;
Statique Const uint8_t D10 D10  = 1;

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"
};

Statique Const Court Int BUILTIN_LED0 = D0 D0; GPIO0
/ nom d’hôte pour mDNS. Devrait travailler au moins sur les fenêtres. Essayer http://esp8266.local */
Const Char Char *ESPHostname ESPHostname = "ESP";

Serveur DNS
Const Octet DNS_PORT = 53;
DNSServateur dnsServateur;

Conmmon Paramenters
Bool SoftAccOK (en)  = Faux;

Serveur Web
ESP8266WebServateur Serveur(80);

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


Dois-je me connecter au Wi-Fi dès que possible ? */
Boolean Connecter;

La dernière fois que j’ai essayé de me connecter au Wi-Fi//
longue dernière Connexion 0;
Unsigned Long currentMillis = 0;
Unsigned Long startMillis;
Const Court Période = 10;  Dormir après cette minute d’inactivité


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

WiFiEEPromData MyWiFiConfig (en);
String Temp = "";

Vide Configuration()
{   Bool ConnectSuccess = Faux;   Bool CréerSoftAPSucc  = Faux;   Bool CInitFSSystem (en)  = Faux;   Bool CInitHTTPServateur  = Faux;   Octet Len;   pinMode(D0 D0, Sortie); Initialiser la broche BUILTIN_LED1 comme sortie   Série.Commencer(9600);   Série.println();   Wifi.Hostname(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   {     Titres d’identité valides trouvés.     Si (MyWiFiConfig (en).APSTA APSTA == Vrai)  AP Mode     {       Serial.println ("mode AP");       Serial.println (MyWiFiConfig.APSTA);       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     {       Serial.println ("mode STA");       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("DefaultWiFi Cnf");     SetDefaultWiFiConfig ();     CréerSoftAPSucc = CréerWifiSoftAP();     saveCredentials (en)();     Clignoter     digitalWrite (en)(D0 D0, Faible); Tirez sur LOW _Led ON     Retard(500);     digitalWrite (en)(D0 D0, Haute);     Retard(500);     digitalWrite (en)(D0 D0, Faible); Tirez sur LOW _Led ON     Retard(500);     digitalWrite (en)(D0 D0, Haute);     Retard(500);     digitalWrite (en)(D0 D0, Faible); Tirez sur LOW _Led ON   }   Si ((ConnectSuccess Ou CréerSoftAPSucc) Et CInitFSSystem (en))   {     InitalizeHTTPServer();     digitalWrite (en)(D0 D0, Faible); Tirez sur LOW _Led ON     Série.println("OK");   }   Autre   {     Série.setDebugOutput(Vrai); Debug Sortie pour WLAN sur Serial Interface.     Série.Imprimer("Err");     SetDefaultWiFiConfig ();     CréerSoftAPSucc = CréerWifiSoftAP();     saveCredentials (en)();     InitalizeHTTPServer();   }   startMillis = Millis();  heure de début initiale
}

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);   Si (MyWiFiConfig (en).CapPortal (CapPortal)) {     Serveur.Sur("/generate_204", handleRoot);  Portail captif Android. Peut-être pas né cessaire. Peut être manipulé par nonFound gestionnaire.   }   Si (MyWiFiConfig (en).CapPortal (CapPortal)) {     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   }   Si (MyWiFiConfig (en).CapPortal (CapPortal)) {     Serveur.Sur("/fwlink", handleRoot);  Portail captif Microsoft. Peut-être pas né cessaire. Peut être manipulé par nonFound gestionnaire.   }   server.on ("/generate_204", handleRoot);  Portail captif Android. Peut-être pas né cessaire. Peut être manipulé par nonFound gestionnaire.   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   server.on ("/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 CréerWifiSoftAP()
{   Wifi.Débrancher();   Série.Imprimer("SoftAP");   Wifi.softAPConfig (en)(apIP, apIP, netMsk netMsk (en));   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(600); Sans délai, j’ai vu l’adresse IP vide   Si (SoftAccOK (en))   {     Série.println("OK");     Série.println(MyWiFiConfig (en).APSTAName APSTAName);     Série.println(MyWiFiConfig (en).WiFiPwd (WiFiPwd));     /Configuration du serveur DNS redirigeant tous les domaines vers l’apIP /     dnsServateur.setErrorReplyCode(DNSReplyCode (en)::NoError (NoError));     dnsServateur.Commencer(DNS_PORT, "*", apIP);   } Autre   {     Série.println("err");     Série.println(MyWiFiConfig (en).APSTAName APSTAName);     Série.println(MyWiFiConfig (en).WiFiPwd (WiFiPwd));   }   Retour SoftAccOK (en);
}


Octet ConnectWifiAP (en)()
{   Serial.println ("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.   Wifi.Commencer(MyWiFiConfig (en).APSTAName APSTAName, MyWiFiConfig (en).WiFiPwd (WiFiPwd));   connRes  = Wifi.waitForConnectResult();   Retard(500);   Tandis que (( connRes == 0 ) Et ( != 10))  si connRes 0 "IDLE_STATUS - changer Statius"   {     connRes  = Wifi.waitForConnectResult();     Retard(1000);     ++;     Série.println(".");     déclaration(s)   }   Tandis que (( connRes == 1 ) Et ( != 10))  si connRes 1 NO_SSID_AVAILin - SSID ne peut être atteint   {     connRes  = Wifi.waitForConnectResult();     Retard(1000);     ++;     Série.println(".");     déclaration(s)   }   Si (connRes == 3 ) {     Série.Imprimer("STA");     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("Err: MDNS");     } Autre {       Mdns.addService("http", "tcp", 80);     }   }   Si (connRes == 4 ) {     Série.println("STA Pwd Err");     Serial.print ("PwLen:");     Serial.println (strlen(MyWiFiConfig.WiFiPwd);     Serial.print ("PwSize");     Serial.println (sizeof(MyWiFiConfig.WiFiPwd);     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);   Retour connRes;
}

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     }   } Autre Station Mode   {   }   Fin vérifier erreurs logiques   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, "My_WLANDevice", 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)) ); pas de mot de passe   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("RstWiFiCrd");
}

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 ENC_TYPE_WEP:       Sortie = "WEP";       Retour Sortie;       Pause;     Cas ENC_TYPE_TKIP:       Sortie = "WPA";       Retour Sortie;       Pause;     Cas ENC_TYPE_CCMP:       Sortie = "WPA2";       Retour Sortie;       Pause;     Cas ENC_TYPE_NONE:       Sortie = "Aucun";       Retour Sortie;       Pause;     Cas ENC_TYPE_AUTO:       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 ";   }
}






Vide handleRoot() {   Page principale:   fs_info FSInfo;   Temp = "";   Court PicCompte = 0;   Octet ServArgs = 0;   Page de construction   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;Captive Portal’lt;/title 'lt;/head’gt;";   Temp += "lt;h2 'gt;Captive Portal’lt;/h2 'gt;";   Temp += "Lt;body’gt;";   Serveur.envoyerContent(Temp);   Temp = "";   Temp += " 'lt;br’gt;'lt;lt;lt;lt;lt;2 bgcolor ' largeur blanche '500 cellpadding '5 'gt;'lt;caption’gt;lt;p’lt;h3'gt;Sytemlinks:'lt;/h22'lt;/p gt;'lt;/caption;   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;/th’lt;/tr’gt;/table’t;'lt;'lt;br’gt;lt;br’lt;lt;br’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);   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;   }   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;/th’lt;/tr’gt;/table’t;'lt;'lt;br’gt;lt;br’lt;lt;br’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.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);     pinMode(D6 D6, Sortie);     digitalWrite (en)(D6 D6, Faible);   }   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[];       }       MyWiFiConfig.APSTAName[len-1] '0';       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[];         }       }       MyWiFiConfig.WiFiPwd[len-1] '0';       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)();       pinMode(D6 D6, Sortie);       digitalWrite (en)(D6 D6, Faible);        = 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("Err STA");         Série.println();         Serveur.Client().Arrêter();         Retard(100);         Wifi.setAutoReconnect (Faux);         Retard(100);         Wifi.Débrancher();         Retard(1000);         pinMode(D6 D6, Sortie);         digitalWrite (en)(D6 D6, Faible);         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("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.;     }     Fin WifiAP   }   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;Sytemlinks:lt;/h2 'gt;'lt;/p’lt;/caption 'lt;'lt;'lt;tr;tr’gt;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 = "";
}

#define SD_BUFFER_PIXELS 20

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

 

 

Ich w’nnsche viel Spaà beim testen des Captive Portals und bei der Implementierung in eigene Projekte.

Esp-8266Projekte für fortgeschrittene

15 commentaires

Ludwig

Ludwig

Vielen Dank für das schöne Projekt.

Bei der Beschäftigung damit bin ich auf eine minimalistische Alternative gestoßen, nämlich “ESPConnect”. Es handelt sich ebenfalls um ein Captive Portal, über das eine WiFi-Verbindung eingerichtet werden kann. Die Einfachheit des Implementierung ist nicht zu übertreffen – es sind nur ein paar Zeilen Code erforderlich. Die Bibliothek läuft sowohl auf dem ESP8266 als auch auf dem ESP32.

Man kann die Bibliothek über die Arduino-Bibliotheksverwaltung einbinden. Es steht dann ein Beispiel zur Verfügung.

Gruß

Ludwig

MaKo

MaKo

Hallo ,
Danke , das Portal funktioniert nach Beseitigung der Compilerfehlermeldungen (fix Portzuweisungen erstellt! Ja ich weiß portabler Code schaut anders aus) Aber zunächst muß der Code ja erst mal übersetzt werden.
Bei mir erscheint das Portal nur auf einem alten Windows mobile! Bei anderen Mobiles (Android devices) kann ich nur die Netzwerkinfo Seite anschauen?? Habe dann auf dem WinGerät meine Home SSID und mein Passwrt eingegeben. Aber nach Netztrennenung und wieder anschalten ist wieder nur My_WlANDevice aktive!
Ich würde gerne meine 8-10 ESP Knoten die mit Mosquitto MQTT Brooker arbeiten und fix mit meinem Heim-Netzwerk verbunden sind mit dem Captive portal verknüpfen, weiss aber nicht wie ich das bewerkstelligen soll! (wenn denn die Auswahl erhalten bliebe) gibts da noch eine Anleitung ?
Bedanke mich schon mal im vorraus
Gruß Martin

ILIJA

ILIJA

Hello Tobias,
I see mistake in the loadCredentials():
if (String(MyWiFiConfig.ConfigValid) = String(“TK”)) —> it will not work correctly.
Shall be:
if (String(MyWiFiConfig.ConfigValid) == String(“TK”)) —> use “==” intead of “=”

Same for ESP32.

Regards
Ilija

Rudolf Schenke

Rudolf Schenke

Mit der von mit vermuteten Änderung (Vereinfachen des if-Ausdrucks) läuft es!!

Rudolf Schenke

Rudolf Schenke

Im Code muss ein Fehler sein!? Nach jedem Reset landet der ESP wieder im AP-Mode.
Die vermutete Fehlerquelle:
– in setup() oben: bool CInitFSSystem = false;
– in setup() weiter unten: if ((ConnectSuccess or CreateSoftAPSucc) and CInitFSSystem) Da die Variable “CInitFSSystem” nie auf “true” gesetzt wird, kommt das Programm auch nie weiter.

Th. Springer

Th. Springer

Hallo zusammen,

ohne diese Werte geht auch das Compilieren des Codes und auch die Funktion dazu auf einem ESP8266.
-——————————————————————————
static const uint8_t D0 = 16;
static const uint8_t D1 = 5;
static const uint8_t D2 = 4;
static const uint8_t D3 = 0;
static const uint8_t D4 = 2;
static const uint8_t D5 = 14;
static const uint8_t D6 = 12;
static const uint8_t D7 = 13;
static const uint8_t D8 = 15;
static const uint8_t D9 = 3;
static const uint8_t D10 = 1;
-———————————————————————————-
Im GitHub Portal ist das nicht drin !

mfg
Th. Springer

Alex

Alex

Danke für den Blogbeitrag!
Wenn man aber nicht alles selber machen will, gibt es die fertige Bibliothek “WifiManager” (MIT Lizenz) für den ESP8266 ;)

https://github.com/tzapu/WiFiManager

Rolf Schatten

Rolf Schatten

Super Idee, unter welcher Lizenz steht der Code?

Ralf Krämer

Ralf Krämer

Hallo,

hat das schon jemand mit einem esp32 umgesetzt?
Ich gehe mal davon aus, dass es die includes alle für esp32 gibt.

Gruß
Ralf

Jürgen Willnecker

Jürgen Willnecker

Schöne Idee, dieses grundlegende Problem als source code zur Verfügung zu stellen.

Ich würde mir bei den externen Spezialaufrufen einen erklärenden Kommentar wünschen.

Im code Hardwareanschlüsse (D0, D6) direkt anzusprechen, führt zu Fehlern beim Wechsel des Boards. Ein “no-go”.

Bei meinem Wemos D1 liegt die blaue BuildInLED auf D4. Bei einem ESP-01 mal so, mal anders (es gibt hier 2 verschiedene Versionen).
const int LED_blue1 = 2; // blaue LED (ESP-01S) – Board #1
const int LED_blue2 = 1; // blaue LED (ESP-01S) – Board #2

D0 erklärt sich jedoch über eine Definition im source code.
Aber D6? Muss da mit Reset gebrückt werden? Wozu ist ein LOW erforderlich?

Christian Zittier

Christian Zittier

Vorerst mal Danke jedoch hab ich aufgrund meiner Unwissenheit ein Problem mit dem Code.
Nach dem Flashvorgang (NodeMCU V3) sehe ich im Browser die Seite stelle wie beschrieben die WLan Einstellungen um er Übernimmt auch das Netzwerk und ist unter der neuen IP verfügbar aber nach einem Reset oder Stromausfall ist alles weg.
Eigentlich sollte der neue WLan Zugang im EEprom gespeichert werden macht es aber offensichtlich nicht? Bei einem Reboot von der Webseite aus bleiben die WLan Einstellungen erhalten

Hab auch mehrere Bord Einstellungen probiert jedoch ohne erfolg.
Würde mich freuen wenn mann mir auf die Sprünge hilft wollte auch ein fertiges funktionierendes Projekt mit meinen MQTT-Brocker integrieren (WLan Einstellungen aus dem Projekt entfernt und mit diesem Code ersetzt geht leider auch nicht irgendwie bin ich einfach zu Blöd. Mein Gedanke selbst wenn nach einem Neustart die WLan Einstellungen weg sind und ich nicht weiß warum, so müsste ja nach dem Anpassen der WLan Einstellungen das integrierte Projekt doch funktionieren?

l.g. Christian

Ilias

Ilias

Hallo Tobias,

vielen Dank, wirklich eine schöne Idee und optisch sehr ansprechend.

Daher habe es auch gleich auf einem “AZ-Delivery NodeMCU ESP8266-12E mit OLED Display” ausprobiert – leider mit mäßigem Erfolg:

Der AP-Mode funzt Wechsel in den Server-Mode funktioniert nur selten. Meistens wird wieder in den AP-Mode gewechselt. Beim Versuch, mit dem Handy (Adroid, Samsung S7 und S9) zuzugreifen eine Meldung dass es eine unseicher Verbindung sei und daher der Zugriff unterbunden wird (AP und Server-Mode). Wenn man die Daten für den AP-Mode ändern will, werden die Änderungen nicht im EEPROM gespeichert. Es ist bleiben immer die Default-Werte.

Leider sind die Meldungen auf der Seriellen Schnittstelle teilweise sehr kryptisch, was ein Debuggen erschwert.

Hat wer eine Idee, wie man das Programm verbessern kann, so dass es stabil läuft?
Zusatzfrage: Ich möchte die jeweilig IP-Adresse auf dem OLED ausgeben. Konnte aber weder die passenden stellen im Programm, noch den Funkitonsaufruf für die IP finden.

Grüße,
Ilias

Ulrich Klaas

Ulrich Klaas

Hallo,
das Portal funktioniert. Ich kann mit dem Handy zugreifen und die Zugangsdaten meines Routers eintragen. Wenn ich danach aber neu boote bleibt nach wie vor der Accesspoint
sichtbar und die NodeMCU verbindet sich nicht mit meinem Router.

Ich habe allerdings den Namen des Portals geändert. Das kann aber wohl nicht der Grund sein, oder ?

Ulrich Klaas

Ulrich Klaas

Was sollen den die Constdefinitionen von D0 – D10 ?
Ich kriege da Fehlermeldungen weil die natürlich schon definiert sind (NodeMCU).

Nehme ich die raus compiliert es.
Ulli

Hermann Schönbauer

Hermann Schönbauer

Super!!! Habe es bisher über eine starre “Notverbindung” zu einer fixen SSID gelöst. Aber so ist es wesentlich eleganter und überall einsetzbar.
Gratuliere
Hermann

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