Buonasera, ho fatto delle prove a cambiare i parametri della connessione WiFi all’interno del codice ma qualcosa non va. Riporto un esempio di codice semplificato che presenta il problema
In questo caso, il WiFi non si connette al primo SSID (che non esiste) ma non si connette neanche al secondo (che esiste ed è corretto)
Se inverto l’ordine delle operazioni, inserendo prima i parametri corretti, il WiFi si connette regolarmente e resta collegato anche dopo il tentativo di cambiare.
IN OGNI CASO alla seconda begin ottengo l’errore
E (10580) wifi:sta is connecting, cannot set config
A nulla serve una disconnect.
Vi è capitato? Come si fa a cambiare SSID/PWD senza riavviare l’esp32?
L'ESP32 continua a tentare di connettersi al primo SSID finché non viene raggiunto uno stato di successo (IP ottenuto) oppure tu stesso non interrompi il processo con WiFi.disconnect().
Per questo la seconda chiamata ti da errore.
Tu dici che la disconnect non servea a nulla, ma non è chiaro come hai provato dal pezzo di codice che hai messo. Tieni conto che lo stack WiFi gira in un suo task specifico ed è essenzialmente gestito ad eventi e non in maniera sequenziale. Tu stai usando un timeout di 5 secondi che potrebbero essere pochi.
Ad ogni modo, io sconsigliosempre di mettere le password in chiaro nel proprio firmware, ma di usare piuttosto un buon wifi manager. L’ESP32 ha un’area di memoria dedicata al salvataggio delle credenziali WiFi e se il WiFi manager è fatto come si deve andrà ad usare quella con le dovute accortezze.
Con gli sketch “semplici” di esempio che si trovano nell’IDE dove le password sono scritte in chiaro, basta un editor di file binari per leggerle senza alcuna fatica.
Questo ad esempio è il compilato dell’esempio WiFiMulti.ino e come puoi vedere dallo screenshot si leggono chiaramente tutte e 3 le credenziali complete usate nell’esempio in questione.
Ad ogni modo, se hai bisogno di gestire due o più SSID diverse nello stesso firmware prova a dare un’occhiata all’esempio WiFiMulti.ino a cui ho accennato anche prima.
Più in generale, per approfondire ti consiglio di provare anche l’esempio WiFiClientEvents.ino in modo da farti un’idea del tempo di connessione necessario aiutandoti con i log puntuali associati ad ogni evento che riguarda lo stato del WiFi.
Come puoi vedere, in questo esempio non c’è il classico ciclo while nel setup che attende la connessione proprio perché il task che gestisce il WiFi gira in parallelo al task “arduino”.
I experienced the same issue with Arduino Version 3.3.0 .
When WiFi connection setup was tried with wrong credentials (e.g. due to password has changed) the next setup is not working, even with correct credentials.
It seems that WiFi.disconnect is not working any more correctly.
Also WiFi scan doesn't work any more, when no or wrong credentials are given and for sure WiFi.disconnect() is done before the scan.
I found reported new issue: WiFi.disconnect(true,true) not working correctly in "IDE SDK=v3.3.0" · Issue #11742 · espressif/arduino-esp32 · GitHub
Hopefully there will come some correction.
Solo se di interesse per qualche lettore:
Quando WiFi.disconnect() non funziona come previsto (ad esempio a causa di credenziali errate utilizzate in precedenza), la sequenza
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
risolve il problema.
Sembra che aggiungere WiFi.mode(WIFI_OFF); sia una sorta di soluzione alternativa al problema WiFi.disconnect(); che non sempre funziona correttamente.
... almeno fino al problema menzionato in precedenza: [WiFi.disconnect(true,true) non funziona correttamente in "IDE SDK=v3.3.0" · Problema n. 11742 · espressif/arduino-esp32 · GitHub]
non verrà risolto.
(tradotto dall'inglese all'italiano da Google Translate)