Hallo Leute, aktuell stehe ich leider bei einem kleinen Problem an, wo ich eure Hilfe brauchen könnte. Ich versuche gerade eine HTML Seite zu basteln, womit ich meine WiFi-Netzwerke anzeige, wobei ich dann SSID und Passwort in Eingabefelder eingeben möchte, um diese Daten auf meinem ESP32 zu speichern. Um die Daten nach einmaliger Eingabe zu persistieren, habe ich mittels SPIFFS ein JSON-File gespeichert, welches die ID und den dazugehörigen Key speichert. Bei Restart des ESP, durchlauft der Setup dann einmalig die "getDatafromMemoryAndConnect()"-Methode und versucht, die Daten aus der JSON zu laden und eine Verbindung damit herzustellen. Leider stoße ich hier immer auf folgendes Problem: Auf meinem Async-Server habe ich einen Endpunkt erstellt, welche die Daten aus den Eingabefeldern auslest und an meine Wifi Methode übergibt, um eine Verbindung herzustellen. Nun wird für versucht, eine Verbindung herzustellen. Falls es klappt, sollen die Daten auf meinem JSON gespeichert werden, falls nicht, sollte ein 400er Error zurück gegeben werden. Leider stürzt mein ESP wegen einem getriggerten Watchdog immer ab, sobald falsche Daten eingegeben haben. Ich vermute hier, dass die 10 Sekunden Wartezeit den Watchdog auslösen, da der ESP denkt, hängen geblieben zu sein.. habe ich das richtig verstanden? Würde es hier einen besseren Workaround geben oder geht der Ansatz schon in eine richtige Richtung? Da die Probleme eigentlich nur auftreten, wenn die Wifi Credentials falsch sind, ist mir auch aufgefallen, dass es vorkommen kann, zuerst die richtigen Daten einzugeben -> ESP verbindet sich. Nun drückt man im Browser jedoch bei bereits verbundenem ESP auf zurück und sendet falsche Daten erneut. Nun ist der ESP aber schon verbunden und speichert die falschen in mein JSON, da er ja nur prüft, ob er eine Verbindung herstellen konnte. Wie kann ich dies umgehen?
:
Verschoben durch Moderator
Andreas P. schrieb: > Wie kann ich dies umgehen? Z.B. in dem du die Forumsanleitung richtig liest und das beachtest: Wichtige Regeln - erst lesen, dann posten! Groß- und Kleinschreibung verwenden Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
Wo siehst du keine Groß und Kleinschreibung? Habe nun den Code angefügt! Sorry!
Offenbar ist dir noch gar nicht so richtig klar, was da im Fehlerfall passiert. Baue ganz viele Log Meldungen in dein Programm ein und beobachte sie während das Programm läuft. Oder besorge dir einen Debugger. In deinem Quelltext sind mit ein paar Sachen aufgefallen: > if (getDatafromMemoryAndConnect() == true || WiFi.isConnected()) Da du gerade einen Request empfangen hast, ist Wifi hier immer connected. Der Else-Zweig wird nie durchlaufen. Und wenn doch, dann kann das aber nicht gehen: > } else { > // Otherwise, redirect to Auth. > requestForWiFiList == true; > request->redirect("/setupmanager.html"); > } Ohne Verbindung kann man wohl kaum mit einem HTTP Redirect antworten. > server.on("/api/networks", HTTP_GET, [](AsyncWebServerRequest *request) { > requestForWiFiList = true; > if(networkList != "") request->send(200, "application/json", networkList); > }); Und wenn networkList leer ist, antwortest du dann einfach gar nicht. Das kann nicht in Ordnung sein. > server.on("/api/connectWifi", HTTP_POST, [](AsyncWebServerRequest *request) { > ... > WiFi.begin(ssid.c_str(), key.c_str()); > ... > request->send(200, "text/plain", "Verbindung hergestellt!"); Funktioniert das? Es fällt mir gerade schwer vorzustellen, wie der Server noch eine Antwort an den Browser schicken soll, wenn er zwischendurch eine neue Verbindung zum AP aufbaut. Dabei wird doch die Verbindung, auf welcher der Browser die Antwort erwartet, getrennt. Oder nicht? Andreas P. schrieb: > Falls es klappt, sollen die Daten auf meinem JSON gespeichert werden Was meinst du damit? Ich sehe in deinem Sketch keinen Aufruf von writeFile(). Andreas P. schrieb: > Ich vermute hier, dass die 10 Sekunden Wartezeit den Watchdog > auslösen, da der ESP denkt, hängen geblieben zu sein Vermuten ist ganz schlecht. Vergewissere dich, was da passiert. Die Variablen startTime und timeout verwendest du nirgendwo. Wo sollen die von dir genannten 10 Sekunden her kommen? Schau dir mal im folgenden Fragment deine Kommentare a, und was du darunter wirklich machst:
1 | if (getDatafromMemoryAndConnect() == true || WiFi.isConnected()) { |
2 | // Redirect to setupmanager.
|
3 | requestForWiFiList == true; |
4 | request->redirect("/setupmanager.html"); |
5 | } else { |
6 | // Otherwise, redirect to Auth.
|
7 | requestForWiFiList == true; |
8 | request->redirect("/setupmanager.html"); |
9 | }
|
Insgesamt scheint es, dass du hier wild zusammen kopiert hast, ohne es zu verstehen. Du solltest noch mal von vorne anfangen, mit sehr viel kleineren Projekten, die du überblicken kannst. Aber vorher informiere dich, wie HTTP funktioniert. Fange z.B. mit http://stefanfrings.de/mikrocontroller_buch/Einstieg%20in%20die%20Elektronik%20mit%20Mikrocontrollern%20-%20Band%202.pdf Kapitel 10 an und schaue auch mal auf den Entwickler-Seiten von Microsoft vorbei. Die dokumentieren solche Sachen nämlich auch sehr gut. Nächstes mal, zeige die vollständigen Programme in compilierbarer Form. Dann muss man weniger raten, was die Fragmente zu bedeuten haben könnten.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.