diff --git a/src/net/nl_wifi_w600.c b/src/net/nl_wifi_w600.c index e39f706..e1af294 100644 --- a/src/net/nl_wifi_w600.c +++ b/src/net/nl_wifi_w600.c @@ -41,6 +41,11 @@ static uint8_t s_ap_channel = 6; static char s_ap_live_ssid[NL_SSID_LEN], s_ap_live_pass[NL_PASS_LEN]; static uint8_t s_ap_live_channel; static bool s_ap_live; +/* mDNS im eigenen AP haengt am ZUSTAND (Standalone + AP steht), nicht am Erzeugungsereignis: + * betritt die Lampe Standalone auf einem schon laufenden, unveraenderten AP, entsteht kein + * SOFTAP_SUCCESS mehr. Beides nur im Netz-Task angefasst. */ +static bool s_ap_event_seen; /* zum aktuell stehenden AP kam SOFTAP_SUCCESS an */ +static bool s_ap_mdns_done; /* fuer den aktuell stehenden AP wurde nl_mdns_on_ip_up() gerufen */ /* Drei Versuche, dann der Rueckfall auf Daten, die schon einmal getragen haben: einer koennte * ein Zufall sein (das Funkteil raeumt gerade den alten AP ab), aber drei hintereinander * heissen, dass das Funkteil genau diese Daten nicht annimmt. Und 3 x 5 s hoechstens @@ -127,6 +132,7 @@ static void destroy_ap(void) tls_wifi_softap_destroy(); s_ap_create_pending = false; s_ap_live = false; + s_ap_event_seen = s_ap_mdns_done = false; clear_softap_param(); /* C2: every softap teardown clears the persisted SOFTAP bit */ } @@ -172,6 +178,8 @@ static void start_ap(void) s_ap_create_retry_at = nl_app_now_ms() + 5000u; s_ap_live = r == WM_SUCCESS; if (s_ap_live) { + /* Neuer AP: erst das Ereignis abwarten, dann bekanntmachen. */ + s_ap_event_seen = s_ap_mdns_done = false; copy(s_ap_live_ssid, ssid, sizeof s_ap_live_ssid); copy(s_ap_live_pass, s_ap_pass, sizeof s_ap_live_pass); s_ap_live_channel = s_ap_channel; @@ -281,7 +289,7 @@ static void net_task(void *arg) nl_wifi_actions_t ev, tick; uint32_t m = 0, now; bool got_ip_event = false, connected_now, ap_wanted, unexpected_softap, - standalone_ap_up; + standalone_now; bool recheck_ap = false; memset(&ev, 0, sizeof ev); @@ -333,8 +341,7 @@ static void net_task(void *arg) * (which only guards s_sm and the credential buffers) is held. */ unexpected_softap = m == (MSG_NETIF | NETIF_WIFI_SOFTAP_SUCCESS) && !ap_wanted; /* Nur die Lage merken; der Aufruf nach aussen folgt hinter der Entsperrung. */ - standalone_ap_up = m == (MSG_NETIF | NETIF_WIFI_SOFTAP_SUCCESS) && - s_sm.state == NL_WIFI_ST_STANDALONE; + standalone_now = s_sm.state == NL_WIFI_ST_STANDALONE; unlock(); if (unexpected_softap) { @@ -356,8 +363,17 @@ static void net_task(void *arg) * Ohne diesen Aufruf findet die App ein Standalone-Geraet nicht - am * 2026-10-01 am EVK gemessen: REST auf der AP-IP lief, ninlight-681f.local * war weder aufloesbar noch sichtbar. */ - if (standalone_ap_up) + if (m == (MSG_NETIF | NETIF_WIFI_SOFTAP_SUCCESS)) + s_ap_event_seen = true; + /* Zustandsgebunden: auch ein Wechsel auf einen unveraendert stehenden AP loest es aus. + * Mehrfaches Rufen waere harmlos, s_ap_mdns_done spart es trotzdem. Faellt der Zustand + * weg, gilt die Bekanntmachung beim naechsten Eintritt neu. */ + if (!standalone_now) + s_ap_mdns_done = false; + else if (s_ap_live && s_ap_event_seen && !s_ap_mdns_done) { + s_ap_mdns_done = true; nl_mdns_on_ip_up(); + } /* M3: retry a softap create that failed, as long as the SM still wants the AP up. */ if (s_ap_create_pending && ap_wanted && due_now(now, s_ap_create_retry_at)) {