Forum: Mikrocontroller und Digitale Elektronik ESP32 WROOM mit Async Webserver WDT Reset nach dem Verbinden von 2. Client


von Luca S. (chababo)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Ich betreibe einen ESP32 WROOM als Async Webserver mit der Library 
"ESPAsyncWebServer".
Das Problem ist, wenn ich einen 2. Client verbinde, während bereits ein 
Client verbunden ist und damit das Webinterface aufrufe, wird der WDT 
getriggert und der ESP startet neu.

Habe den Debug Output im Anhang.

Hat jemand eine Idee, wie man das Problem löst?

Das Wifi-Netzwerk wird hier erstellt:
1
void createWifiNetwork(const char* ssid, const char* password) {
2
  Serial.print("Setting soft-AP configuration ... ");
3
  Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
4
5
  Serial.print("Setting soft-AP ... ");
6
  Serial.println(WiFi.softAP(ssid, password) ? "Ready" : "Failed!");
7
8
  Serial.print("Soft-AP IP address = ");
9
  Serial.println(WiFi.softAPIP());
10
}

Ansonsten werden im setup() einfach die routes gesetzt a la:
1
server.on("/", HTTP_GET, [](AsyncWebServerRequest * request)
2
  {
3
    request->send(LittleFS, "/index_user.html", "text/html");
4
  });

Die loop() Methode ist leer.

: Bearbeitet durch User
von MaWin O. (mawin_original)


Lesenswert?

Deine Library ist kaputt. Wende dich an den Hersteller.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Luca S. schrieb:
> Hat jemand eine Idee, wie man das Problem löst?
Grundsätzlich: man sorgt dafür, dass der Watchdog rechtzeitig vor Ablauf 
des Timeouts wieder zurückgesetzt wird.

Der wird nämlich nur deshalb "ausgelöst", weil irgendwer auf irgendwas 
wartet, was nicht (schnell genug) passiert.

von Εrnst B. (ernst)


Lesenswert?

Luca S. schrieb:
> Ansonsten werden im setup() einfach die routes gesetzt a la

Sind alle Routes solche statischen LittleFS-Dateien? Oder hast du auch 
Routen in denen du dynamisch Content erstellst und dabei länger wartest? 
Das geht nämlich nicht.

von Luca S. (chababo)


Lesenswert?

Εrnst B. schrieb:
> Luca S. schrieb:
>> Ansonsten werden im setup() einfach die routes gesetzt a la
>
> Sind alle Routes solche statischen LittleFS-Dateien? Oder hast du auch
> Routen in denen du dynamisch Content erstellst und dabei länger wartest?
> Das geht nämlich nicht.

Ja, ist alles statischer Content.

von Εrnst B. (ernst)


Lesenswert?

Hmmm... Hab mit der ESP-Async-Webserver schon deutlich mehr Verbindungen 
gleichzeitig offen gehabt, das ist eigentlich kein Problem. Nichtmal auf 
dem kleineren ESP8266. Auch nicht wenn Daten für einen Request dynamisch 
über viele tausende Callbacks zusammengesammelt und Bröckchenweise 
rausgesendet werden.

Aber: Hab das noch nie im Soft-AP-Modus getestet. Kann das einen 
Unterschied machen?

Schlägt der Watchdog schon zu wenn mehrere Clients nur verbunden sind, 
aber keine HTTP-Verbindung offen haben?

von Monk (roehrmond)


Lesenswert?

Εrnst B. schrieb:
> Schlägt der Watchdog schon zu wenn mehrere Clients nur verbunden sind,
> aber keine HTTP-Verbindung offen haben?

Nein

von Luca S. (chababo)


Lesenswert?

Εrnst B. schrieb:
> Aber: Hab das noch nie im Soft-AP-Modus getestet. Kann das einen
> Unterschied machen?

Also heißt, immer über einen Router?


Ich aktualisiere einige Daten dynamisch per XML:

index.js
1
function triggerESP32Xml() {
2
  var readyState = "ReadyState: " + xmlHttpSensors.readyState;
3
  xmlHttpSensors = createXmlHttpRequestObject();
4
  xmlHttpSensors.open("PUT", "xml", true);
5
  xmlHttpSensors.onreadystatechange = processXmlResponse;
6
  xmlHttpSensors.send(null);
7
8
  setTimeout("triggerESP32Xml()", 100);
9
}
10
11
function processXmlResponse() {
12
  if (xmlHttpSensors.readyState == 4) {
13
    var xmlResponse;
14
    var xmlElements;
15
16
    // Get the XML stream
17
    xmlResponse = xmlHttpSensors.responseXML;
18
    //************************************ */
19
    // Update System Info section
20
    // Bat. Percentage / Voltage
21
    xmlElements = xmlResponse.getElementsByTagName("Vb");
22
    batteryVoltage = xmlElements[0].firstChild.nodeValue;
23
...
24
}
25
}

Ob es damit zusammenhängen kann?

Aber sollte ja trotzdem jeder Client seine eigenen Requests haben.

Εrnst B. schrieb:
> Schlägt der Watchdog schon zu wenn mehrere Clients nur verbunden sind,
> aber keine HTTP-Verbindung offen haben?

Nein.

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

Ohje, 1990er-Style-Javascript.

Starte den nächsten "setTimeout" erst, nachdem der vorherige Request 
komplett abgearbeitet wurde.


Und überleg dir, das auf aktuelles JS und Json umzustellen. Da wird der 
ganze Code-Block oben zu
1
const status = await (await fetch("/status")).json();
2
batteryVoltage = status.Vb;
o.Ä.

von Luca S. (chababo)


Lesenswert?

Εrnst B. schrieb:
> Ohje, 1990er-Style-Javascript.

Ja, bin kein JS Pro.

Εrnst B. schrieb:
> Und überleg dir, das auf aktuelles JS und Json umzustellen. Da wird der
> ganze Code-Block oben zu
> const status = await (await fetch("/status")).json();
> batteryVoltage = status.Vb;

Danke für den Tipp. Ja, JS Kenntnisse zu verbessern steht auch noch auf 
meiner Liste.

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.