Hallo, samen
De positieve weerklank en het algemeen belang van de voorganger over een blog Gevangen hoofdinganglegt me bovendien een speciale, andere blog over het onderwerp schrijven en op een aantal punten en wenst te komen in detail van je. Onder vele andere indringende vragen waarop ik later komen nog steeds de wens, de hoofdingang voor intern gebruik niet alleen op een ESP8266, maar ook van hem zorgde ESP32 te laten rennen. Dit is niet mogelijk met de vijand. Aangevuld met enkele veranderingen, vooral de gebruikte bibliotheek, gebruik moet worden gemaakt. Vandaar dat de code van vandaag een executable is alleen op de ESP32. In detail een optimalisering, kom naast de Libraryanpassungen ook vooral voor de ESP32.
In verband met wat de lezers van de blog heeft ze waarschijnlijk leek dat de ESP op zichzelf nog niet kunnen doen punt meer reconnecten behoren aan de toegang wordt geweigerd, nadat hij rebootet werd. Ik kan aanpassen afluisterapparatuur in na een langere zoektocht. Dit waarschijnlijk de stakingen bij de samenwerking met bepaalde punten die toegang met ESP ondanks blijf bij de WLAN gegevens wordt afgewezen door de registratie in het toegangspunt svond te geven en consequent veranderingen van het station eigen mode toegangspunt in mode. Met dit proces de vorige WLAN toegang tot gegevens van de zijn gedoofd, EEPROM (dit is dus wilde).
De oplossing voor deze bug systeem aan de kant is om te proberen de registratie ondanks meerdere keren van een zogenaamd "fout" voor toegang tot gegevens, opnieuw in de mode is toegangspunt veranderd.
Andere kleine verbetering ace uit de actuele IP adres gegeven wordt allemaal hetzelfde in mode is die van de ESP32 op de seriële poort. Who would like to spend this IP adres met plezier tonen, op zijn enige probleem moet veranderen op een geschikte plaats in de code.
Mogelijk om compatibel te zijn met vele kamers ESP, verzaak ik voorts de kwestie van de externe aantal havens van de is ESP.
Ook in dit onderdeel van de code voegt ESP32 gevangen met de oorspronkelijke hoofdingang Gevangen hoofdingang op. WLAN heeft het de naam "ESP_Config" en het wachtwoord "12345678". Hiermee kunnen we combineren met onze mobiele telefoon en worden begeleid door de gsm automatisch op de gesloten hoofdingang webpagina. Dit past ook bij het ontwerp en functionaliteit aan die onmisbaar is in het vorige deel.
Nu we deze webpagina kunt klikken op de link "WiFi aan omgevingen", en nu een uitgebreide configuratie bereiken WLAN kant waarmee we kunnen selecteren nu een netto moeten combineren met die van de ESP32:
De radiozender van de omroep Radio hier goed gekozen en het wachtwoord gegeven worden bewaard in het EEPROM. Met de volgende boot probeert te combineren met de ESP32 van dit netwerk. Als we daar niet in slagen, na herhaaldelijke pogingen omdat het netwerk niet toegankelijk is, bijvoorbeeld meer, of het wachtwoord veranderd was, schakelaars van het ESP terug in de mode toegangspunt en wacht tot een nieuwe configuratie.
De aangepaste code voor de gesloten hoofdingang voor de ESP32 is:
[
# include <WiFi.H> # include <WiFiClient.H> # include <Webserver.H> # include <ESPmDNS.H> # include <DNS-server.H> # include <EEPROM.H> # define GPIO_OUT_W1TS_REG (DR_REG_GPIO_BASE + 0x0008) # define GPIO_OUT_W1TC_REG (DR_REG_GPIO_BASE + 0x000c) Statische const byte WiFiPwdLen = 25; Statische const byte APSTANameLen = 20; struct WiFiEEPromData { bool APSTA = Waar; Station //access punt of mode waar mode - AP bool PwDReq = Valse; //PasswordRequired bool CapPortal = Waar ; Op //captiveportal van AP mode char APSTAName[APSTANameLen]; //STATION / AP naam punt aan te sluiten, als definded char WiFiPwd[WiFiPwdLen]; //WiFiPAssword als definded char ConfigValid[3]; //If configuratie is Vaild, dag "TK" nodig is " }; /* mDNS hostnaam voor. Zou moeten werken op contracten voor de ramen. Proberen http://esp8266.local */ const char *ESPHostname = "ESP32"; //DNA server const byte DNS_PORT = 53; DNS-server DNS-server; //Conmmon Paramenters bool SoftAccOK = Valse; //Web server Webserver server(80); /* AP van zacht netwerk parametre */ IPAD jurk apIP(172, 20, 0, 1); IPAD jurk netMsk(255, 255, 255, 0); Niet getekend lang currentMillis = 0; Niet getekend lang startMillis; * WLAN / huidige status */ Korte status = WL_IDLE_STATUS; WiFiEEPromData MyWiFiConfig; String Uitzendkracht =""; Leegte Valstrik() { REG_WRITE(GPIO_OUT_W1TS_REG, BEETJE(GPIO_NUM_16)); Meditatie sanering //guru fout vastgesteld Vertraging(1); REG_WRITE(GPIO_OUT_W1TC_REG, BEETJE(GPIO_NUM_16)); //Guru sanering meditatie duidelijk fout bool ConnectSuccess = Valse; bool CreateSoftAPSucc = Valse; bool CInitFSSystem = Valse; bool CInitHTTPServer = Valse; byte len; Serie.beginnen(9600); Terwijl (!Serie) { ; //wait voor seriële poort met elkaar in contact te brengen. Nodig voor de inheemse USB } Serie.println(En de volgende("Seriële interface initalized op Baud 9600.")); WiFi.setAutoReconnect (Valse); WiFi.Aanhoudende(Valse); WiFi.Verbinding verbreken(); WiFi.set hostnaam(ESPHostname); //Set een host toegewezen aan station DHCP ESP. Als (loadCredentials()) WLAN //load inloggegevens voor WiFi instellingen { Serie.println(En de volgende("Valide referenties te vinden.")); Als (MyWiFiConfig.APSTA == Waar) //AP mode { Serie.println(En de volgende("Toegangspunt geselecteerde mode.")); Serie.println(MyWiFiConfig.APSTA); len = strlen(MyWiFiConfig.APSTAName); MyWiFiConfig.APSTAName[len+1] = '\0'; len = strlen(MyWiFiConfig.WiFiPwd); MyWiFiConfig.WiFiPwd[len+1] = '\0'; CreateSoftAPSucc = CreateWifiSoftAP(); } Anders { Serie.println(En de volgende("Station geselecteerde mode.")); len = strlen(MyWiFiConfig.APSTAName); MyWiFiConfig.APSTAName[len+1] = '\0'; len = strlen(MyWiFiConfig.WiFiPwd); MyWiFiConfig.WiFiPwd[len+1] = '\0'; len = ConnectWifiAP(); Als ( len == 3 ) { ConnectSuccess = Waar; } Anders { ConnectSuccess = Valse; } } } Anders { //Set standaard Config creëren - AP Serie.println(En de volgende("Geen geldige papieren te vinden.")); SetDefaultWiFiConfig (); CreateSoftAPSucc = CreateWifiSoftAP(); saveCredentials(); Vertraging(500); } Als ((ConnectSuccess of CreateSoftAPSucc)) { Serie.Afdrukken (En de volgende("IP adres:")); Als (CreateSoftAPSucc) { Serie.println(WiFi.softAPIP());} Als (ConnectSuccess) { Serie.println(WiFi.localIP());} InitalizeHTTPServer(); } Anders { Serie.setDebugOutput(Waar); //Debug output voor op seriële interface WLAN. Serie.println(En de volgende("Fout: kan geen verbinding maken met WLAN. Stel de standaard configuratie. ")); SetDefaultWiFiConfig(); CreateSoftAPSucc = CreateWifiSoftAP(); InitalizeHTTPServer(); SetDefaultWiFiConfig(); saveCredentials(); } } Leegte InitalizeHTTPServer() { bool initok = Valse; /* Valstrik pagina's root weven: config pagina's, wifi, volgens hoofdingang in gevangenschap levende detectoren en */ gevonden server.Op("/", handleRoot); server.Op("wifi /", handleWifi); Als (MyWiFiConfig.CapPortal) { server.Op("/generate_204", handleRoot); } In gevangenschap levende //android hoofdingang. Misschien nodig hebt. Kunnen worden aangepakt door nietgevonden begeleider. Als (MyWiFiConfig.CapPortal) { server.Op("/favicon.ico", handleRoot); } In gevangenschap levende //another Android hoofdingang. Misschien nodig hebt. Kunnen worden aangepakt door nietgevonden begeleider. Sony gecontroleerd op mobiele telefoon Als (MyWiFiConfig.CapPortal) { server.Op("fwlink /", handleRoot); } In gevangenschap levende //microsoft hoofdingang. Misschien nodig hebt. Kunnen worden aangepakt door nietgevonden begeleider. //server.on ("/generate_204", handleRoot); / / in gevangenschap levende Android hoofdingang. Misschien nodig hebt. Kunnen worden aangepakt door nietgevonden begeleider. //server.on ("/favicon.ico", handleRoot); / / intern een andere androïde hoofdingang. Misschien nodig hebt. Kunnen worden aangepakt door nietgevonden begeleider. Sony gecontroleerd op mobiele telefoon //server.on ("/ fwlink", handleRoot); / / in gevangenschap levende Microsoft hoofdingang. Misschien nodig hebt. Kunnen worden aangepakt door nietgevonden begeleider. server.onNotFound ( handleNotFound ); //Storage Kop-elementen verzoek //server.collectHeaders (koppen, sizeof (Headers) / sizeof (Headers [0])); server.beginnen(); //Web server beginnen } boolean CreateWifiSoftAP() { WiFi.Verbinding verbreken(); Serie.Afdrukken(En de volgende("Initalize SoftAP")); Als (MyWiFiConfig.PwDReq) { SoftAccOK = WiFi.softAP(MyWiFiConfig.APSTAName, MyWiFiConfig.WiFiPwd); //Password lengte van ten minste 8 tekenen. } Anders { SoftAccOK = WiFi.softAP(MyWiFiConfig.APSTAName); //Access punt woord zonder paspoort Functie: //overload; WiFi.softAP (ssid, paspoort woord, kanaal, verborgen) } Vertraging(2000); Ik heb //without vertraging meren het IP-adres shiningly WiFi.softAPConfig(apIP, apIP, netMsk); als (SoftAccOK) { /* Instellen van de DNS-server omgeleid alle domeinen aan de apIP */ dns.setErrorReplyCode(DNSReplyCode::NoError); dns-server.start(DNS_PORT, "*", apIP); Seriële.println(F("succesvol.")); // Serial.setDebugOutput(true); // Debug Output voor het WLAN op de Seriële Interface. } anders { Seriële.println(F("Soft AP Fout.")); Seriële.println(MyWiFiConfig.APSTAName); Seriële.println(MyWiFiConfig.WiFiPwd); } terug SoftAccOK; } byte ConnectWifiAP() { Seriële.println(F("Initalizing Wifi-Client.")); byte connRes = 0; byte ik = 0; WiFi.verbinding verbreken(); WiFi.softAPdisconnect(true); // Functie stelt momenteel is geconfigureerd SSID en het wachtwoord van de soft-AP voor null-waarden. De parameter is optioneel. De instelling true schakelt de soft-AP-modus is uitgeschakeld. vertraging(500); WiFi.beginnen(MyWiFiConfig.APSTAName, MyWiFiConfig.WiFiPwd); connRes = WiFi.waitForConnectResult(); terwijl (( connRes == 0 ) en (ik != 10)) //als connRes == 0 "IDLE_STATUS - wijzigen Statius" { connRes = WiFi.waitForConnectResult(); vertraging(2000); ik++; Serieel.afdrukken(F(".")); // instructie(s) } terwijl (( connRes == 1 ) en (ik != 10)) //als connRes == 1 NO_SSID_AVAILin - SSID kan niet worden bereikt { connRes = WiFi.waitForConnectResult(); vertraging(2000); ik++; Serieel.afdrukken(F(".")); // instructie(s) } als (connRes == 3 ) { WiFi.setAutoReconnect(true); // Set of module zal proberen opnieuw verbinding te maken met een toegangspunt in het geval dat de verbinding is verbroken. // Setup MDNS responder als (!MDNS.beginnen(ESPHostname)) { Seriële.println(F("Fout: MDNS")); } anders { MDNS.addService("http", "tcp", 80); } } terwijl (( connRes == 4 ) en (ik != 10)) //als connRes == 4 Slechte Wachtwoord. Soms gebeurt dit met corrct PWD { WiFi.beginnen(MyWiFiConfig.APSTAName, MyWiFiConfig.WiFiPwd); connRes = WiFi.waitForConnectResult(); vertraging(3000); ik++; Serieel.afdrukken(F(".")); } als (connRes == 4 ) { Seriële.println(F("STA Pwd Err")); Seriële.println(MyWiFiConfig.APSTAName); Seriële.println(MyWiFiConfig.WiFiPwd); WiFi.verbinding verbreken(); } // if (connRes == 6 ) { Serial.println("verbinding VERBROKEN - Niet in het station modus"); } // gratis WiFi.printDiag(Serieel); Seriële.println(""); terug connRes; } #define SD_BUFFER_PIXELS 20 /* plaats de WLAN-referenties van de EEPROM */ bool loadCredentials() { bool RetValue; EEPROM.beginnen(512); EEPROM.krijgen(0, MyWiFiConfig); EEPROM.einde(); als (String(MyWiFiConfig.ConfigValid) = String("TK")) { RetValue = waar; } anders { RetValue = false; // WLAN-Instellingen niet te vinden. } terug RetValue; } /** Bewaar de WLAN-referenties naar EEPROM */ bool saveCredentials() { bool RetValue; // Check logische Fouten RetValue = ware; als (MyWiFiConfig.APSTA == true ) //AP-Modus { als (MyWiFiConfig.PwDReq en (sizeof(String(MyWiFiConfig.WiFiPwd)) < 8)) { RetValue = false; // Ongeldige Configuratie } als (sizeof(String(MyWiFiConfig.APSTAName)) < 1) { RetValue = false; // Ongeldige Configuratie } } als (RetValue) { EEPROM.beginnen(512); voor (int i = 0 ; i < sizeof(MyWiFiConfig) ; ik++) { EEPROM.schrijven(ik, 0); } strncpy( MyWiFiConfig.ConfigValid , "TK", sizeof(MyWiFiConfig.ConfigValid) ); EEPROM.zetten(0, MyWiFiConfig); EEPROM.plegen(); EEPROM.einde(); } terug RetValue; } void SetDefaultWiFiConfig() { byte len; MyWiFiConfig.APSTA = ware; MyWiFiConfig.PwDReq = true; // standaard PW vereiste MyWiFiConfig.CapPortal = ware; strncpy( MyWiFiConfig.APSTAName, "ESP_Config", sizeof(MyWiFiConfig.APSTAName) ); len = strlen(MyWiFiConfig.APSTAName); MyWiFiConfig.APSTAName[len+1] = '\0'; strncpy( MyWiFiConfig.WiFiPwd, "12345678", sizeof(MyWiFiConfig.WiFiPwd) ); len = strlen(MyWiFiConfig.WiFiPwd); MyWiFiConfig.WiFiPwd[len+1] = '\0'; strncpy( MyWiFiConfig.ConfigValid, "TK", sizeof(MyWiFiConfig.ConfigValid) ); len = strlen(MyWiFiConfig.ConfigValid); MyWiFiConfig.ConfigValid[len+1] = '\0'; Seriële.println(F("Reset WiFi Referenties.")); } void handleRoot() { // Hoofdpagina: temp = ""; byte PicCount = 0; byte ServArgs = 0; // HTML-Header server.sendHeader("Cache-Control", "no-cache, no-store, moet-geldigmaking"); server.sendHeader("Pragma", "no-cache"); server.sendHeader("Vervalt", "-1"); server.setContentLength(CONTENT_LENGTH_UNKNOWN); // HTML-Inhoud - server.verzenden ( 200, "text/html", temp ); // Speichersparen - Schon mal dem Cleint senden temp = ""; temp += "<!DOCTYPE HTML><html lang= " de " ><head><meta charset='UTF-8'><meta name= viewport content='width=device-width, initial-scale=1.0,'>"; server.sendContent(temp); temp = ""; temp += "<style type='text/css'><!-- DIV.container { min-height: 10em; display: table-cell; vertical-align: middle }.toets {height:35px; width:90px; font-size:16px}"; server.sendContent(temp); temp = ""; temp += "body {background-color: powderblue;}</style>"; temp += "<head><title>Hauptseite</title></head>"; temp += "<h2>Hauptseite</h2>"; temp += "<body>"; server.sendContent(temp); temp = ""; // Verwerking op Verzoek van de Gebruiker temp = ""; temp += "<table border=2 bgcolor = white width = 500 cellpadding =5 ><caption><p><h3>Systemlinks:</h2></p></caption>"; temp += "<tr><th><br>"; temp += "<een href='/wifi - >WIFI-Einstellungen</a><br><br>"; temp += "</th></tr></table><br><br>"; temp += "<footer><p>Geprogrammeerd en ontworpen door: Tobias Kuch</p><p>Contact informatie: <a href='mailto:tobias.kuch@googlemail.com'>tobias.kuch@googlemail.com</a>.</p></footer>"; temp += "</body></html>"; server.sendContent(temp); temp = ""; server.client().stoppen(); //Stop is noodzakelijk, omdat we geen lengte stuurde inhoud } Leegte handleNotFound() { Als (captivePortal()) { //If caprive hoofdingang sturen in plaats van fout bij het tonen van de pagina. Terugkeer; } Uitzendkracht = ""; //HTML kop server.sendHeader("Cache-Control", "Geen cache geen winkel, must-revalidate"); server.sendHeader("Pragma", "Geen cache"); server.sendHeader("Afloopt", "-1"); server.setContentLength(CONTENT_LENGTH_UNKNOWN); //HTML inhoud Uitzendkracht += "<! DOCTYPE HTML>, < lang = html" de ">, <, head>, <, meta name = tekenset" UTF-8 ">, <, meta = inhoud blikveld =" = breedte breedte apparaat, schaal 1.0 = eerste, ">"; Uitzendkracht += "<, type style =" text / css ">, <! - DIV.container {min hoogte: ze 10em; display: tabelcel; vertical-align:} {midden .button hoogte 35px; Breedte 90px; Lettergrootte 16px} "; Uitzendkracht += "Lichaam {achtergrondkleur: Poederblauwcolor;} < /style>;"; Uitzendkracht += "<, head>, <, title> bestand found<, /title>, < /head>;"; Uitzendkracht += "h2> <; 404 bestanden moeten Found<, /h2>, < br>; "; Uitzendkracht += "<, h4>, debuggen Information:<, /h4>, < br>;"; Uitzendkracht += "< body>;"; Uitzendkracht += "URI:"; Uitzendkracht += server.Uri(); Uitzendkracht += "\nMethod:"; Uitzendkracht+= ( server.Methode() == HTTP_GET ) ? "Gaan". : "POST"; Uitzendkracht += "<, br> argumenten:;"; Uitzendkracht += server.Argumenten(); Uitzendkracht += "\n"; Voor ( uint8_t Ik = 0; Ik < server.Argumenten(); Ik++ ) { Uitzendkracht += " " + server.Slechte naam ( Ik ) + ": " + server.Slecht ( Ik ) + "\n"; } Uitzendkracht += "<, br> - server Hostheader:"+ server.hostHeader(); Voor ( uint8_t Ik = 0; Ik < server.Koppen(); Ik++ ) { Uitzendkracht += " " + server.headerName ( Ik ) + ": " + server.header ( Ik ) + "\n< br>;"; } Uitzendkracht += "<, /table>, <, /form>, <, br>, <, br>, <, zie tabel grens = 2 bgcolor = wit breedte = 500 cellpadding = 5 >, <, caption>, <, p>, <, h2>, u kunt wilt bladeren to:<, /h2>, <, /p>, < /caption>;"; Uitzendkracht += "<, tr>, < th>;"; Uitzendkracht += "< a href="/nl"> voornaamste Page<, /a>, < br>;"; Uitzendkracht += "< a href="/nl/ wifi" >, WIFI Settings<, /a>, < br>;"; Uitzendkracht += "<, /th>, <, /tr>, <, /table>, <, br>, < br>;"; Uitzendkracht += "<, footer>, <, p>, geprogrammeerd door: Tobias kuch<, /p>, <, p>, contactinformatie: < = a href" mailto tobias.kuch@googlemail.com ">, tobias.kuch@googlemail.com <, /a>, .<, /p>, < /footer>;"; Uitzendkracht += "<, /body>, < /html>;"; server.sturen ( 404, "", Uitzendkracht ); server.cliënt().Stoppen(); //Stop is noodzakelijk, omdat we geen lengte stuurde inhoud Uitzendkracht = ""; } / * In gevangenschap levende omleiden naar de hoofdingang als er een verzoek om een ander domein. Waar terug in dat geval dus de begeleider de pagina proberen te besluiten het verzoek opnieuw */ boolean captivePortal() { Als (!isIp(server.hostHeader()) && server.hostHeader() != (String(ESPHostname)+".local")) { //Serial.println ("verzoek doorgestuurd naar portaal voor intern gebruik"); server.sendHeader("Locatie", String("http://") + toStringIp(server.cliënt().localIP()), Waar); server.sturen ( 302, "text / plain", ""); //Empty remt header inhoud Inhoudslengte moet dus het onszelf sluit de socket. server.cliënt().Stoppen(); //Stop is noodzakelijk, omdat we geen lengte stuurde inhoud Terugkeer Waar; } Terugkeer Valse; } * Config / begeleider Wifi pagina */ Leegte handleWifi() { //Page:/wifi byte Ik; byte len ; Uitzendkracht = ""; //Check dat site van parametre Als (server.hasArg("Reboot") ) //Reboot systeem { Uitzendkracht = "Herstarten systeem binnen 5 seconden."; server.sturen ( 200, "text / html", Uitzendkracht ); Vertraging(5000); server.cliënt().Stoppen(); WiFi.Verbinding verbreken(); Vertraging(1000); } Als (server.hasArg("WiFiMode") en (server.Slecht("WiFiMode") == "1") ) WTA //station mode een ander station verbinden met WIFI { startMillis = millis(); Teller //reset tijd zien te vermijden die whiole stationair draaien Aan de bestaande STATION //connect Als ( sizeof(server.Slecht("WiFi_Network")) > 0 ) { Serie.println("Mode STA"); MyWiFiConfig.APSTA = Valse; Station //access punt of fashion - fashion valse station Uitzendkracht = ""; Voor ( Ik = 0; Ik < APSTANameLen;Ik++) { MyWiFiConfig.APSTAName[Ik] = 0; } Uitzendkracht = server.Slecht("WiFi_Network"); len = Uitzendkracht.Lengte(); Voor ( Ik = 0; Ik < len;Ik++) { MyWiFiConfig.APSTAName[Ik] = Uitzendkracht[Ik]; } Uitzendkracht = ""; Voor ( Ik = 0; Ik < WiFiPwdLen;Ik++) { MyWiFiConfig.WiFiPwd[Ik] = 0; } Uitzendkracht = server.Slecht("STAWLanPW"); len = Uitzendkracht.Lengte(); Voor ( Ik = 0; Ik < len;Ik++) { Als (Uitzendkracht[Ik] > 32) //Tax signalen sturen { MyWiFiConfig.WiFiPwd[Ik] = Uitzendkracht[Ik]; } } Uitzendkracht = "WiFi verbinding maken met AP."; Uitzendkracht += MyWiFiConfig.APSTAName; Uitzendkracht += "- <, br> PW WiFi."; Uitzendkracht += MyWiFiConfig.WiFiPwd; Uitzendkracht += "- < br>;"; Uitzendkracht += "Toegang krijgen tot mode WTA in 2 Seconds.< br>;"; server.sturen ( 200, "text / html", Uitzendkracht ); server.sendContent(Uitzendkracht); Vertraging(2000); server.cliënt().Stoppen(); server.Stoppen(); Uitzendkracht = ""; WiFi.Verbinding verbreken(); WiFi.softAPdisconnect(Waar); Vertraging(500); //ConnectWifiAP bool SaveOk = saveCredentials(); Ik = ConnectWifiAP(); Vertraging(700); Als (Ik != 3) - //4 WL_CONNECT_FAILED paspoort is onjuist woord 1: - SSID WL_NO_SSID_AVAILin geconfigureerd kan worden bereikt { Serie.Afdrukken(En de volgende("Kan geen verbinding maken met netwerk genoemd. Reden: ")); Serie.println(Ik); server.cliënt().Stoppen(); Vertraging(100); WiFi.setAutoReconnect (Valse); Vertraging(100); WiFi.Verbinding verbreken(); Vertraging(1000); SetDefaultWiFiConfig(); CreateWifiSoftAP(); Terugkeer; } Anders { //Safe Config bool SaveOk = saveCredentials(); InitalizeHTTPServer(); Terugkeer; } } } Als (server.hasArg("WiFiMode") en (server.Slecht("WiFiMode") == "2") ) AP //change mode { startMillis = millis(); Teller //reset tijd zien te vermijden die whiole stationair draaien //Configure toegangspunt Uitzendkracht = server.Slecht("APPointName"); len = Uitzendkracht.Lengte(); Uitzendkracht =server.Slecht("APPW"); Als (server.hasArg("PasswordReq")) { Ik = Uitzendkracht.Lengte(); } Anders { Ik = 8; } Als ( ( len > 1 ) en (server.Slecht("APPW") == server.Slecht("APPWRepeat")) en ( Ik > 7) ) { Uitzendkracht = ""; Serie.println(En de volgende("APMode")); MyWiFiConfig.APSTA = Waar; //Access punt of waar jonge mode - AP mode Als (server.hasArg("CaptivePortal")) { MyWiFiConfig.CapPortal = Waar ; Op //captiveportal van AP mode } Anders { MyWiFiConfig.CapPortal = Valse ; } Als (server.hasArg("PasswordReq")) { MyWiFiConfig.PwDReq = Waar ; //Passport woord in de mode vereiste AP } Anders { MyWiFiConfig.PwDReq = Valse ; } Voor ( Ik = 0; Ik < APSTANameLen;Ik++) { MyWiFiConfig.APSTAName[Ik] = 0; } Uitzendkracht = server.Slecht("APPointName"); len = Uitzendkracht.Lengte(); Voor ( Ik = 0; Ik < len;Ik++) { MyWiFiConfig.APSTAName[Ik] = Uitzendkracht[Ik]; } MyWiFiConfig.APSTAName[len+1] = '\0'; Uitzendkracht = ""; Voor ( Ik = 0; Ik < WiFiPwdLen;Ik++) { MyWiFiConfig.WiFiPwd[Ik] = 0; } Uitzendkracht = server.Slecht("APPW"); len = Uitzendkracht.Lengte(); Voor ( Ik = 0; Ik < len;Ik++) { MyWiFiConfig.WiFiPwd[Ik] = Uitzendkracht[Ik]; } MyWiFiConfig.WiFiPwd[len+1] = '\0'; Uitzendkracht = ""; Als (saveCredentials()) AP //save ConfigCongfig { Uitzendkracht = "Gegevens van de supermarkt. Modi met succes opgeslagen. Onvermijdelijk opnieuw opstarten. "; } Anders { Uitzendkracht = "Gegevens van de supermarkt. gebrekkig vormen."; } } Anders Als (server.Slecht("APPW") != server.Slecht("APPWRepeat")) { Uitzendkracht = ""; Uitzendkracht = "WLAN wachtwoord niet meteen. Uncompletedly. "; } Anders { Uitzendkracht = ""; Uitzendkracht = "WLAN wachtwoord of AP naam te kort. Uncompletedly. "; } } //HTML kop server.sendHeader("Cache-Control", "Geen cache geen winkel, must-revalidate"); server.sendHeader("Pragma", "Geen cache"); server.sendHeader("Afloopt", "-1"); server.setContentLength(CONTENT_LENGTH_UNKNOWN); //HTML inhoud Uitzendkracht += "<! DOCTYPE HTML>, < lang = html" de ">, <, head>, <, meta name = tekenset" UTF-8 ">, <, meta = inhoud blikveld =" = breedte breedte apparaat, schaal 1.0 = eerste, ">"; server.sturen ( 200, "text / html", Uitzendkracht ); Uitzendkracht = ""; Uitzendkracht += "<, type style =" text / css ">, <! - DIV.container {min hoogte: ze 10em; display: tabelcel; vertical-align:} {midden .button hoogte 35px; Breedte 90px; Lettergrootte 16px} "; Uitzendkracht += "Lichaam {achtergrondkleur: Poederblauwcolor;} <, /style>, <, head>, <, title>, slimmerik naamplaat - WiFi Settings<, /title>, < /head>;"; server.sendContent(Uitzendkracht); Uitzendkracht = ""; Uitzendkracht += "<, h2>, WiFi Einstellungen<, /h2>, <, body>, < left>;"; Uitzendkracht += "<, zie tabel grens = 2 bgcolor = wit breedte = 500 >, <, td>, <, h4>, geldende WiFi instellingen: < /h4>;"; Als (server.cliënt().localIP() == apIP) { Uitzendkracht += "Fashion: zachtjes toegangspunt (AP) < br>;"; Uitzendkracht += "SSID:" + String (MyWiFiConfig.APSTAName) + "<, br>, < br>;"; } Anders { Uitzendkracht += "Fashion: Station (WTA) < br>;"; Uitzendkracht += "SSID:"+ String (MyWiFiConfig.APSTAName) + "< br>;"; Uitzendkracht += "BSSID:" + WiFi.BSSIDstr()+ "<, br>, < br>;"; } Uitzendkracht += "<, /td>, <, /table>, < br>;"; server.sendContent(Uitzendkracht); Uitzendkracht = ""; Uitzendkracht += "<, formulieractie = '/ wifi methode' =" post ">"; Uitzendkracht += "<, zie tabel grens = 2 bgcolor = wit width = 500>, <, tr>, <, th>, < br>;"; Als (MyWiFiConfig.APSTA == 1) { Uitzendkracht += "<, inbreng type =" radio "= waarde" 1 de naam van '= WiFiMode "> WiFi station Mode< br>; "; } Anders { Uitzendkracht += "<, inbreng type =" radio "= waarde" 1 de naam van '= WiFiMode "> gecontroleerd; WiFi station Mode< br>; "; } Uitzendkracht += "Beschikbare WiFi Networks:<, zie tabel grens = 2 bgcolor = wit >, <, /tr>, <, /th>, <, td>, aantal <, /td>, <, td>, SSID <, /td>, <, td>, versleuteling <, /td>, <, td>, WiFi kracht < /td>;"; server.sendContent(Uitzendkracht); Uitzendkracht = ""; WiFi.scanDelete(); int N = WiFi.scanNetworks(Valse, Valse); //WiFi.scanNetworks (, async show_hidden) Als (N > 0) { Voor (int Ik = 0; Ik < N; Ik++) { Uitzendkracht += "<, /tr>, < /th>;"; String Nrb = String(Ik); Uitzendkracht += "< td>;" + Nrb + "< /td>;"; Uitzendkracht += "< td>;" + WiFi.SSID(Ik) +"< /td>;"; Nrb = GetEncryptionType(WiFi.encryptionType(Ik)); Uitzendkracht += "< td>;"+ Nrb + "< /td>;"; Uitzendkracht += "< td>;" + String(WiFi.RSSI(Ik)) + "< /td>;"; } } Anders { Uitzendkracht += "<, /tr>, < /th>;"; Uitzendkracht += "<, td> 1 < /td>;"; Uitzendkracht += "<, td>, noch is er een WLAN found< /td>;"; Uitzendkracht += "<, td> - < /td>;"; Uitzendkracht += "<, td> - < /td>;"; } Uitzendkracht += "<, /table>, <, zie tabel grens = 2 bgcolor = wit >, <, /tr>, <, /th>, <, td>, verbinden met WiFi SSID: <, /td>, <, td>, < kies name =" WiFi_Network ">"; Als (N > 0) { Voor (int Ik = 0; Ik < N; Ik++) { Uitzendkracht += "< mogelijkheid waarde = '" + WiFi.SSID(Ik) +"'>" + WiFi.SSID(Ik) +"< /option>;"; } } Anders { Uitzendkracht += "< mogelijkheid value =" No_WiFi_Network "> en niemand WiFiNetwork gevonden /option>!"; } server.sendContent(Uitzendkracht); Uitzendkracht = ""; Uitzendkracht += "<, /select>, <, /td>, <, /tr>, <, /th>, <, /tr>, <, /th>, <, td>, WiFi paspoort woord: <, /td>, < td>;"; Uitzendkracht += "<, inbreng type =" tekst "naam van =" STAWLanPW "= in maxlength" 40 "= grootte" 40 ">"; Uitzendkracht += "<, /td>, <, /tr>, <, /th>, <, br>, <, /th>, <, /tr>, <, /table>, <, /table>, <, zie tabel grens = 2 bgcolor = wit breedte = 500 >, <, tr>, <, th>, < br>;"; server.sendContent(Uitzendkracht); Uitzendkracht = ""; Als (MyWiFiConfig.APSTA == Waar) { Uitzendkracht += "<, inbreng type =" radio "naam van =" WiFiMode "= 'waarde 2' checked> Wifi-accesspoint mode < br>; "; } Anders { Uitzendkracht += "<, inbreng type =" radio "naam van =" WiFiMode "= 'waarde 2' > Wifi-accesspoint mode < br>; "; } Uitzendkracht += "<, zie tabel grens = 2 bgcolor = wit >, <, /tr>, <, /th>, <, td>, wifi-accesspoint naam: <, /td>, < td>;"; server.sendContent(Uitzendkracht); Uitzendkracht = ""; Als (MyWiFiConfig.APSTA == Waar) { Uitzendkracht += "<, inbreng type =" tekst "naam van =" APPointName "maxlength = '"+String(APSTANameLen-1)+"De grootte van = in" 30 "waarde = '" + String(MyWiFiConfig.APSTAName) + ">, < /td>;"; } Anders { Uitzendkracht += "<, inbreng type =" tekst "naam van =" APPointName "maxlength = '"+String(APSTANameLen-1)+"De grootte van = in" 30 ">, < /td>;"; } server.sendContent(Uitzendkracht); Uitzendkracht = ""; Als (MyWiFiConfig.APSTA == Waar) { Uitzendkracht += "<, /tr>, <, /th>, <, td>, WiFi paspoort woord: <, /td>, < td>;"; Uitzendkracht += "<, inbreng type =" wachtwoord "naam van =" APPW "maxlength = '"+String(WiFiPwdLen-1)+"De grootte van = in" 30 "waarde = '" + String(MyWiFiConfig.WiFiPwd) + ">, < /td>;"; Uitzendkracht += "<, /tr>, <, /th>, <, td>, herhaal WiFi wachtwoord < /td>;"; Uitzendkracht += "<, td>, <, inbreng type =" wachtwoord "naam van =" APPWRepeat "maxlength = '"+String(WiFiPwdLen-1)+"De grootte van = in" 30 "waarde = '" + String(MyWiFiConfig.WiFiPwd) + ">, < /td>;"; } Anders { Uitzendkracht += "<, /tr>, <, /th>, <, td>, WiFi paspoort woord: <, /td>, < td>;"; Uitzendkracht += "<, inbreng type =" wachtwoord "naam van =" APPW "maxlength = '"+String(WiFiPwdLen-1)+"De grootte van =" 30 ">, < /td>;"; Uitzendkracht += "<, /tr>, <, /th>, <, td>, herhaal WiFi wachtwoord < /td>;"; Uitzendkracht += "<, td>, <, inbreng type =" wachtwoord "naam van =" APPWRepeat "maxlength = '"+String(WiFiPwdLen-1)+"De grootte van =" 30 ">, < /td>;"; } Uitzendkracht += "< /table>;"; server.sendContent(Uitzendkracht); Uitzendkracht = ""; Als (MyWiFiConfig.PwDReq) { Uitzendkracht += "<, inbreng type =" optie "naam van" PasswordReq "= checked> Paspoort woord voor aanmelding vereist. "; } Anders { Uitzendkracht += "<, inbreng type =" optie "naam van" PasswordReq "= > Paspoort woord voor aanmelding vereist. "; } server.sendContent(Uitzendkracht); Uitzendkracht = ""; Als (MyWiFiConfig.CapPortal) { Uitzendkracht += "<, inbreng type =" optie "naam van" CaptivePortal "= checked> Activeren hoofdingang gevangen "; } Anders { Uitzendkracht += "<, inbreng type =" optie "naam van" CaptivePortal "= > Activeren hoofdingang gevangen "; } server.sendContent(Uitzendkracht); Uitzendkracht = ""; Uitzendkracht += "<, br>, <, /tr>, <, /th>, <, /table>, <, br>, < knopen type =" submit "= naam van" instellingen "waarde = styles '1' = '50px; hoogte: breedte: 140px 'autofocus>, en dat alles WIFI Settings< /button>; "; Uitzendkracht += "< knopen type =" submit "naam van =" Reboot "waarde = styles '1' = '50px; hoogte: breedte: 200px '>, herstarten System< /button>; "; server.sendContent(Uitzendkracht); Uitzendkracht = ""; Uitzendkracht += "< knopen type =" reset "= naam van" actie "= waarde '1' stijlen ': = hoogte 50px; breedte: 100px '>, Reset<, /button>, < /form>; "; Uitzendkracht += "<, zie tabel grens = 2 bgcolor = wit breedte = 500 cellpadding = 5 >, <, caption>, <, p>, <, h3>, Systemlinks:<, /h2>, <, /p>, <, /caption>, <, tr>, <, th>, < br>;"; server.sendContent(Uitzendkracht); Uitzendkracht = ""; Uitzendkracht += "< a href="/nl"> voornaamste Page<, /a>, <, br>, <, br>, <, /th>, <, /tr>, <, /table>, <, br>, < br>;"; Uitzendkracht += "<, footer>, <, p>, geprogrammeerd en ontworpen door: Tobias kuch<, /p>, <, p>, contactinformatie: < = a href" mailto tobias.kuch@googlemail.com ">, tobias.kuch@googlemail.com <, /a>, .<, /p>, < /footer>;"; Uitzendkracht += "<, /body>, < /html>;"; server.sendContent(Uitzendkracht); server.cliënt().Stoppen(); //Stop is noodzakelijk, omdat we geen lengte stuurde inhoud Uitzendkracht = ""; } * Dit / Is in */ IP boolean isIp(String street) { Voor (int Ik = 0; Ik < street.Lengte(); Ik++) { int C = street.Charme(Ik); Als (C != '.' && (C < '0' || C > '9')) { Terugkeer Valse; } } Terugkeer Waar; } String GetEncryptionType(byte Dit type) { String Output = ""; De //read type versleuteling en geven wat de naam: Schakelaar (Dit type) { Zaak 5: Output = "WEP"; Terugkeer Output; breken; Zaak 2: Output = "WPA"; Terugkeer Output; breken; Zaak 4: Output = "WPA2"; Terugkeer Output; breken; Zaak 7: Output = "Geen"; Terugkeer Output; breken; Zaak 8: Output = "Auto".; Terugkeer Output; breken; } } OT / * * te knopen String toStringIp(IPAD jurk OT) { String res = ""; Voor (int Ik = 0; Ik < 3; Ik++) { res += String((OT >> (8 * Ik)) & 0xFF) + "."; } res += String(((OT >> 8 * 3)) & 0xFF); Terugkeer res; } String formaat bytes(size_t bytes) { //readable tonen van de afmetingen geheugen Als (bytes < 1024) { Terugkeer String(bytes) + "Byte"; } Anders Als (bytes < (1024 * 1024)) { Terugkeer String(bytes / 1024.0) + "KB"; } Anders Als (bytes < (1024 * 1024 * 1024)) { Terugkeer String(bytes / 1024.0 / 1024.0) + "MB"; } } Leegte Lus() { Als (SoftAccOK) { DNS-server.processNextRequest(); //DNA } //HTTP server.handleClient(); }]
In de volgende fase willen we kijken als het praktische gebruik van onze code, en is gebaseerd op basis van deze code een kleine fileserver.
Ik wil een hoop plezier met de hoofdingang en voor intern gebruik bij de uitvoerende ESP32 in eigen projecten.
18 Reacties
Walter
Hi, this code is bugged, please fix it. Thanks,
Jan
Hallo Gerald, herzlichsten Dank!!! Ich hatte da schon einige Stunden herumprobiert, aber immer die falsche Stelle erwischt. Es ist exakt so wie beschrieben: durch das Auskommentieren dieser Zeile in der setup() werden die Credentials nicht überschrieben, dennoch wird ein AP angelegt mit den hinterlegten Zugangsdaten. Dadurch ist es egal, wenn das Gerät mal nicht ins WLAN kommen sollte, der AP stört ja nicht und ließe sich auch durch einen Button aktivieren. Danke nochmal!
Gerald Lechner
Hallo Jan
Ich würde in der Setup-Routine
if ((ConnectSuccess or CreateSoftAPSucc))
{
Serial.print (F("IP Address: “));
if (CreateSoftAPSucc) { Serial.println(WiFi.softAPIP());}
if (ConnectSuccess) { Serial.println(WiFi.localIP());}
InitalizeHTTPServer();
}
else
{
Serial.setDebugOutput(true); //Debug Output for WLAN on Serial Interface.
Serial.println(F(”Error: Cannot connect to WLAN. Set DEFAULT Configuration."));
SetDefaultWiFiConfig();
CreateSoftAPSucc = CreateWifiSoftAP();
InitalizeHTTPServer();
SetDefaultWiFiConfig();
saveCredentials();
}
}
die Zeile saveCredentials(); auskommentieren. Die wird nur dann aufgerufen, wenn keine Verbindung möglich war. Wenn die Credentials hier nicht gespeichert werden, geht der ESP32 zwar in den AP-Modus, speichert diesen Zustand aber nicht ab. Damit werden beim nächsten Start wieder die abgespeicherten Credentials für den Station-Mode genutzt.
Jan
Herzlichen Dank für den tollen Sketch, läuft mit den kleinen Korrekturen soweit sehr gut. Leider werden die manuell gespeicherten WLAN-Daten gelöscht, sobald das WLAN beim Start nicht verfügbar ist. Offenbar werden die Zugangsdaten für AP und STA an der gleichen Stelle im eeprom gespeichert, sodass die vorigen Zugangsdaten unwiederbringlich gelöscht werden, sobald das Gerät in den AP-Modus wechselt. Frage: wie ließen sich die AP-Zugangdaten hart festschreiben, um zu verhindern, dass die eingetragenen WLAN-Daten im AP-Modus gelöscht werden? Im eeprom möchte ich ausschließlich die Daten für den STA-Modus speichern.
Jan
Ein sehr schöner Sketch, herzlichen Dank für die Arbeit und Veröffentlichung. Mit den Tipps aus den Kommentaren läuft das soweit sehr zuverlässig auf meinem ESP32.
Leider stört ein ‘Feature’ in meinem Projekt ganz erheblich: Findet der ESP beim Starten das vorher konfigurierte WLAN nicht, werden die Zugangsdaten komplett gelöscht. Das ist bei temporärem oder instalbilem WLAN ziemlich störend. Meine Frage in die Runde: an welcher Stelle kann ich das am besten verhindern? Die Routine für den Reset-Knopf möchte ich ja nicht komplett löschen. Ziel: WLAN-Zugangsdaten werden nur durch Reset oder Überschreiben gelöscht, nicht aber automatisch.
Danke für Tipps!!!
Achim
Hi kann mir einer schreiben wie diese ESPmDNS.h finde und einbinde .
Normal kann ich Bibilotheken einbinden aber diese finde ich nicht oder die IDE meckert das die Zip keine Bibliothek enthält
Tobias
Sehr geehrter Herr Holler,
Ich muss leider 2 Punkte korrigieren. Zum einen ist die Beschränkung auf 20 Zeichen der SSID kein Fehler sondern eine Limitierung, die im Sinne des open Source Gedankens angepasst werden kann. Zum anderen werden Tests der Software beim Entwickeln und kursorische Abschlusstests vor Veröffentlichung durchgeführt. Ihre generalisierte Aussage, das Tests überhaupt nicht durchgeführt werden ist daher nicht korrekt.
Jedoch sind generell leider auch zeitliche Limitierungen bei der Entwicklung einzuhalten, sodass eben Bugs nicht ganz vermieden werden können. Ich freue mich jedoch, das diese sich bisher auf ein Bug bei einem komplexem Code wie diesen beschränken. Sachliche Hinweise auf diese oder für alle relevante Verbesserungswünsche, ohne Wertung, sind daher immer willkommen und werden im nächsten Release ggf. berücksichtigt.
Walter Holler
Wäre es zu viel verlangt, den veröffentlichten Code vorher mal selbst auszuprobieren?
Ich habe den Code auf meinen neu gekauften ESP32 geladen und mindestens 2 Fehler gefunden:
1) Der Vergleichs-Operator für Gleichheit ist “==”. Das einfache “=” ist eine Zuweisung.
Also in loadCredentials() :
if (String(MyWiFiConfig.ConfigValid) == String(“TK”))
statt
if (String(MyWiFiConfig.ConfigValid) = String(“TK”))
2) Die maximale Länge der SSID Namen ist 32 nicht 20, sonst funktioniert es nicht bei längeren Namen wie bei mir.
static const byte APSTANameLen = 32; //was 20
Dann funktioniert auch der AP Mode, Auswahl des WLANs und Eingabe des Passwords und Wechsel in mein WLAN.
Jedoch nach Reset des ESP32 startet er wieder im AP mode..?
MCL
|ich kann kein ESP_Config finden… Nur ein ESP_C9013b….
das liegt auch an ‘alten’ credentials.
‘C9013b’ ist der zweite Teil der MAC Adresse…
Man kann die Kommandos zum Überschreiben der Credantials ‘zu Fuss’ schreiben oder so:
// if (false) // overwrite only ONCE!!
if (loadCredentials()) // Load WLAN credentials for WiFi Settings
Also einmals mit ’ if (false) ’ kompilieren und laden.
=> so werden die Credentials garantiert korrekt überschrieben
Danach wieder auskommentieren und statt dessen ’ if (loadCredentials()) ’ verwenden und laden.
Manfred
Einfach den Code in einen vernünftigen Editor (z.B. Notpad++) kopieren und schon siehst Du, dass diese Klammer das Gegenstück von Zeile 1 ist. Fehlersuche dauerte nicht länger als die Eingabe Deiner Kommentars.
Tobias
Hallo Matthias,
Gleiches Problem und gleiche wie bei Christoph.
Gruß
Tobias
Hallo Christoph,
Dies liegt darin begründet, das der ESP intern die Credentials speichert, (von deinem vorherigen Projekt) . Um diese loszuwerden, führe EINMALIG in der Setup Routine folgende Sequenz aus:
SetDefaultWiFiConfig();
saveCredentials();
CreateSoftAPSucc = CreateWifiSoftAP();
Damit werden die Daten von dem Vorprojekt überschrieben. Nachdem diese überschrieben wurden, können die Zeilen wieder entfernt werden.
Wolfgang
Gibt es eigentlich auch einen Teil 1?
Ulrich Klaas
Hallo,
im Code für den 8266 ist die Fehlerbehebung aber noch nicht drin ??
Der hat sich nicht verändert. Geschieht das noch ?
mfG
Ulli
Peter Pitzeier
In bool loadCredentials() muss natürlich
if (String(MyWiFiConfig.ConfigValid) == String(“TK”))
und nicht
if (String(MyWiFiConfig.ConfigValid) = String(“TK”))
Christoph O
Danke für das CapturePortal-Besipiel!
Ich habe bei mir das Problem, dass ich vor einiger Zeit bereits einmal einen anderen WLAN-Accesspoint geflasht habe. Die SSID habe ich damals “Heinzelmännchen” genannt.
Nun erscheint nach dem flashen dieses Beispiels wieder der Name “Heinzelmännchen” als SSID und nicht der angegebene “ESP_Config”. Ich vermute, dass “Heinzelmännchen” noch aus alten Zeiten im EEPROM steht und nicht überschrieben wurde.
Ich kann mich leider nicht mit dem Passwort “12345678” verbinden. Das alte Passwort von Heinzelmännchen kenne ich leider nicht mehr.
Kann mir irgendwer weiterhelfen?
Klar, ich könnte wieder ein eigenen WLAN-Accesspoint flashen und alles überschreiben aber hier scheint trotzdem noch ein Bug im Quelltext zu sein.
Matthias
Hallo Zusammen,
ich kann kein ESP_Config finden… Nur ein ESP_C9013b….
Das Passwort funktioniert bei dem letzteren auch nicht.
Ich habe nichts an dem Arduino scetch verändert.
Hat sonst jemand noch dieses Problem?
Ich benutze ein Lolin D32 Pro mit einem ESP32 Wrover Chip
Danke und Gruss
Matthias
Joe
Die
]
gehört wo hin ????