Mir fällt auf, dass anscheinend der Zugriff via mDNS Host nicht mehr funktioniert, wenn der ESP zwischendurch mal den Zugriff auf die Station verliert (z.B. wenn man das WLAN des Routers abschaltet und dann wieder einschaltet.
Könnt ihr das bestätigen?
Mein Ansatz war, dass ich beim Reconnect-Versuch ein neues MDNS.begin() einbaue , aber dann stürzt der ESP ab und zu plötzlich ab mit der Meldung:
assertion "dns server out of array" failed: file "/home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/lwip/lwip/src/core/dns.c",$
abort() was called at PC 0x40111d23 on core 1
ELF file SHA256: 0000000000000000
Ich denk zumindest, dass der Absturz damit zusammenhängt.
Ohne Deinen Code ist es schwierig, hier geeignet Hilfe anzubieten. Grundsätzlich musst Du davon ausgehen, dass Deine mDNS-Implementation (wir wissen noch nicht, welche Du vewendest) nichts davon mitkriegt, wenn die WiFi-Verbindung ausfällt, ihre Anmeldung im Multicast allerdings dahin ist.
Du solltest uns auch mitteilen, welchen ESP Du einsetzst.
Aber mit der While-Schleife versucht der ESP doch 5 Sekunden lang, eine Verbindung aufzubauen und mit der If-clause dann nur kurz und macht danach einfach ne 5-Sekündige, nichtsnutzige Pause, oder? Bin mir aber auch nicht sicher.
Ich hab das mit dem while aus einem Beispiel übernommen und meine, dass das auch bei anderen Beispielen der WiFi-Library so praktiziert wird. Kann mich aber auch täuschen.
Das stimmt insoweit.
Du willst den Abbruch nach 5 Sekunden, wenn die Verbindung nicht aufgebaut wird. Kann man so machen.
Gibt es zu dem wifi.begin() noch das Gegenstück? .end() oder .stop()? Dann sollte das auch noch vorher rein.
Nachtrag.
Es gibt ein .disconnect() danach könntest wieder mit .begin starten.
Oder lässt es ganz raus und versuchst .reconnect().
Sähe dann - nur zusammengebaut und ungetestet - so aus.
void keepWiFiAlive(void *parameters)
{
for (;;)
{
if (WiFi.status() == WL_CONNECTED)
{
Serial.println("Wir sind bereits verbunden!");
vTaskDelay(10000 / portTICK_PERIOD_MS);
}
else
{
// Variante1:
WiFi.disconnect();
// Hier ne kleine Pause?
WiFi.begin(ssid, password);
// Variante2:
/*WiFi.reconnect(); // nur beim ESp8266? */
unsigned long startAttemptTime = millis();
// Hier gehts rein, wenn wir nicht verbunden sind...
// Neu verbinden:
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 5000);
if (WiFi.status() != WL_CONNECTED)
{
Serial.println("Nicht verbunden...!");
}
else
{
// Wir sind wieder verbunden.
// Wieder neu MDNS.begin - OK? Oder überflüssig/böse?
MDNS.begin(host);
}
}
}
}
Das ganze Thema mit dem Wiederverbinden macht mich ganz kirre (schreibt man das so?)
Manche machen
Wifi.disconnect();
Wifi.begin(ssid, password);
der hier
macht
Wifi.disconnect();
Wifi.reconnect(); // Ich glaube dann nimmt der ESP einfach die zuletzt verwendeten Wifi-Zugangsdaten
Und irgendwo hab ich auch mal gelesen, dass es auch ein WiFi.autoconnect(true) und WiFI.autoreconnect(true) geben soll, die nach meinen Versuchen aber nicht wirklich funktionieren.
Ene Mene Miste:
Ich entscheide mich jetzt für das hier:
Wifi.disconnect();
Wifi.begin(ssid, password);
Da sich bei mir theoretisch die Zugangsdaten zur Sketchlaufzeit ändern könnten.