fix(mdns): Bekanntmachung am Zustand statt am Erzeugungsereignis
This commit is contained in:
+20
-4
@@ -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 char s_ap_live_ssid[NL_SSID_LEN], s_ap_live_pass[NL_PASS_LEN];
|
||||||
static uint8_t s_ap_live_channel;
|
static uint8_t s_ap_live_channel;
|
||||||
static bool s_ap_live;
|
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
|
/* 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
|
* 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
|
* 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();
|
tls_wifi_softap_destroy();
|
||||||
s_ap_create_pending = false;
|
s_ap_create_pending = false;
|
||||||
s_ap_live = 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 */
|
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_create_retry_at = nl_app_now_ms() + 5000u;
|
||||||
s_ap_live = r == WM_SUCCESS;
|
s_ap_live = r == WM_SUCCESS;
|
||||||
if (s_ap_live) {
|
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_ssid, ssid, sizeof s_ap_live_ssid);
|
||||||
copy(s_ap_live_pass, s_ap_pass, sizeof s_ap_live_pass);
|
copy(s_ap_live_pass, s_ap_pass, sizeof s_ap_live_pass);
|
||||||
s_ap_live_channel = s_ap_channel;
|
s_ap_live_channel = s_ap_channel;
|
||||||
@@ -281,7 +289,7 @@ static void net_task(void *arg)
|
|||||||
nl_wifi_actions_t ev, tick;
|
nl_wifi_actions_t ev, tick;
|
||||||
uint32_t m = 0, now;
|
uint32_t m = 0, now;
|
||||||
bool got_ip_event = false, connected_now, ap_wanted, unexpected_softap,
|
bool got_ip_event = false, connected_now, ap_wanted, unexpected_softap,
|
||||||
standalone_ap_up;
|
standalone_now;
|
||||||
bool recheck_ap = false;
|
bool recheck_ap = false;
|
||||||
|
|
||||||
memset(&ev, 0, sizeof ev);
|
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. */
|
* (which only guards s_sm and the credential buffers) is held. */
|
||||||
unexpected_softap = m == (MSG_NETIF | NETIF_WIFI_SOFTAP_SUCCESS) && !ap_wanted;
|
unexpected_softap = m == (MSG_NETIF | NETIF_WIFI_SOFTAP_SUCCESS) && !ap_wanted;
|
||||||
/* Nur die Lage merken; der Aufruf nach aussen folgt hinter der Entsperrung. */
|
/* Nur die Lage merken; der Aufruf nach aussen folgt hinter der Entsperrung. */
|
||||||
standalone_ap_up = m == (MSG_NETIF | NETIF_WIFI_SOFTAP_SUCCESS) &&
|
standalone_now = s_sm.state == NL_WIFI_ST_STANDALONE;
|
||||||
s_sm.state == NL_WIFI_ST_STANDALONE;
|
|
||||||
unlock();
|
unlock();
|
||||||
|
|
||||||
if (unexpected_softap) {
|
if (unexpected_softap) {
|
||||||
@@ -356,8 +363,17 @@ static void net_task(void *arg)
|
|||||||
* Ohne diesen Aufruf findet die App ein Standalone-Geraet nicht - am
|
* 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
|
* 2026-10-01 am EVK gemessen: REST auf der AP-IP lief, ninlight-681f.local
|
||||||
* war weder aufloesbar noch sichtbar. */
|
* 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();
|
nl_mdns_on_ip_up();
|
||||||
|
}
|
||||||
|
|
||||||
/* M3: retry a softap create that failed, as long as the SM still wants the AP 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)) {
|
if (s_ap_create_pending && ap_wanted && due_now(now, s_ap_create_retry_at)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user