ESP32 WROOM mit Async Webserver WDT Reset nach dem Verbinden von 2. Client

OP #7499511
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.

Angehängte Dateien:
#7500055
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?

OP #7500071
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.

#7500080
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.Ä.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren