Forum: Mikrocontroller und Digitale Elektronik ESP32 Watchdog Problem


von Andreas P. (andreas_p296)


Angehängte Dateien:

Lesenswert?

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
von Helmut -. (dc3yc)


Lesenswert?

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

von Andreas P. (andreas_p296)


Lesenswert?

Wo siehst du keine Groß und Kleinschreibung?

Habe nun den Code angefügt! Sorry!

von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.