mDNS nicht mehr erreichbar, wenn WLAN zwischendurch abgeschaltet wird

Hi,

hab ne Frage zum Thema mDNS:

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.

Falls ihr dazu Erfahrungen habt, freu ich mich :wink:

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.

Stimmt :wink:

#include <WiFi.h>
#include <WiFiAP.h>
#include <WebServer.h>
WebServer server(80);
#include <ESPmDNS.h>

// Verbindungskrimskrams
unsigned long connTimer=0;
unsigned long dauer = 5000;
const char ssid[10] = "MeineSSID";
const char password[7] = "MeinPW";
const char apssid[12] = "MeineAPSSID";
const char appassword[15] = "MeinAPPasswort";
const char host[9] = "meinhost";

// Dummyseite
const char indexPage[] PROGMEM = R"=====(
  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Expires" content="0">
  </head>
    <body>
      Hello World
    </body>
  </html>
)=====";

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  // Task zum neu connecten, falls erforderlich
  // Geht natürlich auch ohne xTask, aber ich habs halt mal so gelöst
  xTaskCreatePinnedToCore(
    keepWiFiAlive,
    "Keep Wifi Alive",
    5000,
    NULL,
    2,
    NULL,
    CONFIG_ARDUINO_RUNNING_CORE
  ); 
  
  // Erstverbindung aufbauen
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);
  
  connTimer = millis();
  while (WiFi.status() != WL_CONNECTED && (millis() - connTimer < dauer)) {
    //Serial.print(".");
    delay(500);
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("Wir sind verbunden...");
    // mDNS-Host setzen
    MDNS.begin(host);
  } else {
    Serial.println("Wir sind nicht verbunden");
  }
  
  WiFi.softAP(apssid, appassword);
  
  server.on("/", display_root);
  server.begin();
  
  MDNS.addService("http", "tcp", 80);
}

void loop() {
  server.handleClient();
}

void display_root() {
  const char * httpType PROGMEM = "text/html";
  server.send_P(200,  httpType, indexPage);
}

void keepWiFiAlive(void * parameters) {
  for (;;) {
     
      if (WiFi.status() == WL_CONNECTED) {
        Serial.println("Wir sind bereits verbunden!");
        vTaskDelay(10000 / portTICK_PERIOD_MS);
        continue;
      }

      // Hier gehts rein, wenn wir nicht verbunden sind...
      // Neu verbinden:
      WiFi.begin(ssid, password);
      unsigned long startAttemptTime=millis();
      while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 5000) {
        
      }
      
      if (WiFi.status() != WL_CONNECTED) {
        Serial.println("Nicht verbunden...!");
        continue;
      } else {
        // Wir sind wieder verbunden.
        // Wieder neu MDNS.begin - OK? Oder überflüssig/böse?
        MDNS.begin(host); 
        continue;
      }
      
  }
}

Einen ESP32.

Danke schon mal für eure Hilfe.

Ich sehe nirgend vorher ein .end()
Da scheint noch was dahinter zu stecken :slight_smile:

Ah, ok.

Quasi hier:

Das könnte es evtl. schon sein.
Probier ich direkt mal aus. Dankschee!

Ich bin mir nicht sicher, was da tatsächlich passiert, wegen

Du bist für 5 sekunden komplett blind.
Dann kannst auch schreiben:

if (WiFi.status() != WL_CONNECTED)
delay(5000);

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? :wink: 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);
      }
    }
  }
}
1 Like

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.

:slight_smile:

...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.