Go Down

Topic: Ri-connessione WiFi senza bloccare il loop (Read 432 times) previous topic - next topic

khriss75

Buongiorno e buone vacanze (per chi è in vacanza!).

Sto cercando (senza per ora riuscirci) di trovare un modo per riconnettere (in caso di perdita della connessione)  il mio NODEMCU (oppure ESP32) al wifi senza bloccare il loop.

Utilizzo la classicissima forma:

Code: [Select]

  WiFi.begin(ssid, password);
   
  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
    Serial.print(".");
  }


Ovviamente il while blocca il codice finché non avviene la connessione.
Per mitigare il problema ho aggiunto un contatore, ad ogni loop del while incrementa la mia variabile ed una volta arrivata a 30 forzo l'uscita dal loop while.
Attendo 5 minuti e riprovo ad effettuare la connessione.

Il mio problema è che durante l'attesa della connessione (loop while) tutto si blocca li e se ad esempio premo un pulsante pr accendere un led o se arriva un dato da un sensore questi vengono ignorati.

Esiste un modo per effettuare il "WiFi.begin" senza bloccare il loop?

Grazie

nid69ita

#1
Aug 20, 2019, 10:06 am Last Edit: Aug 20, 2019, 10:12 am by nid69ita
Non sò rispondere direttamente. Ma penso che ci voglia sempre un certo minimo di tempo al comando per ricollegarsi

Comunque, prova a leggere qui:
https://www.esp8266.com/viewtopic.php?f=32&t=16241
my name is IGOR, not AIGOR

khriss75

Grazie Nid.
Si, ci vuole un minimo di tempo per la connessione, volevo proprio vedere se è possibile sfruttare quel tempo per altro  :D

Ora do un'occhiata al link.

Ancora grazie

khriss75

Comunque, prova a leggere qui:
https://www.esp8266.com/viewtopic.php?f=32&t=16241
L'esempio funziona con ESP8266 (Utilizza la libreria ESP8266WiFi.h) ma ovviamente non funziona con ESP32.
Vediamo se c'è soluzione anche a questo...

nid69ita

Secondo me i comandi della libreria WiFi sono uguali tra esp8266 e esp32 (almeno spero  :)
my name is IGOR, not AIGOR

khriss75

Purtroppo pare di no...
Nel link che mi hai girato dice:
Methods and properties described in this section are specific to ESP8266. They are not covered in Arduino WiFi library documentation. Before they are fully documented please refer to information below.
Esp32 utilizza WiFi.h (per esp32) e non mi è possibile dichiarare questi eventi:
WiFiEventHandler gotIpEventHandler, disconnectedEventHandler;

Va detto che io sono un ignorante astronomico in materia quindi...

Claudio_FF

#6
Aug 20, 2019, 01:23 pm Last Edit: Aug 20, 2019, 01:24 pm by Claudio_FF
Esiste un modo per effettuare il "WiFi.begin" senza bloccare il loop?
WiFi.begin non blocca il loop.... a bloccarlo è quel while. A te serve quel while? Non fa altro che controllare lo stato prima di proseguire. E' una cosa che a te personalmente serve fare?

Seconda cosa, per quanto ne so la connessione ritorna comunque in piedi da sola anche senza rifare il begin.
* * * * Una domanda ben posta è già mezza risposta * * * *

khriss75

Ciao Claudio, grazie per l'interessamento.
Sinceramente non riesco a comprendere la tua domanda.
So benissimo che a "bloccare" il ciclo è il while e che serve per verificare se è avvenuta la connessione wifi, però omettendolo (il while) senza il blocco del codice avverrebbe comunque la connessione?

Io ho ovviamente bisogno che la connessione wifi avvenga, semplicemente se per qualsiasi motivo si dovesse disconnettere, ho la necessità che si riconnetta (anche dopo x minuti). La cosa importante è che durante la riconnessione non si blocchi il ciclo.

Sinceramente ho trovato anch'io qualche info riguardo la "riconnessione automatica" in caso di disconnessione.

Grazie anche a te per il supporto!


Claudio_FF

però omettendolo (il while) senza il blocco del codice avverrebbe comunque la connessione?
Come detto la connessione va in piedi col begin. Verificare l'avvenuta connessione serve solo se si deve fare qualcosa per cui la connessione deve essere obbligatoriamente già attiva. Ma a quel punto allora basta verificare lo stato nel momento in cui si deve fare quella cosa, mentre tutto il resto può proseguire liberamente.

La riconnessione avviene sicuramente in modo automatico, almeno entro pochi minuti o poche decine di minuti, non so se ci sono timeout più lunghi.
* * * * Una domanda ben posta è già mezza risposta * * * *

khriss75

Perfetto. Ho in effetti verificato quanto dici ed è così (sto utilizzando ESP32).
Approfitto della tua gentilezza (e competenza!!!) Hai mai avuto a che fare con MQTT (libreria pubsudclient)?
Se il client mqtt non è connesso ho anche in questo caso un blocco del loop. Tu hai mai affrontato questo discorso?

Claudio_FF

Hai mai avuto a che fare con MQTT (libreria pubsudclient)?
No, per cui non so se ad essere bloccante è una specifica funzione della libreria, o solo il modo in cui la usi (tipo il while di cui si parlava prima che potrebbe ovviamente essere riscritto in modo non bloccante).
* * * * Una domanda ben posta è già mezza risposta * * * *

khriss75

Non uso while, è proprio la libreria pubsubclient che stoppa per 5 secondi in attesa della connessione. Devo provare altre librerie.
Grazie.

nid69ita

#12
Aug 23, 2019, 09:33 am Last Edit: Aug 23, 2019, 09:35 am by nid69ita
Secondo me devi evitare il comando di MQTT se non c'e' connessione.
Mi pare ovvio che il comando ci prova a inviare ma se non c'e' collegamento ci prova per un pò (magari puoi abbassare il timeout ma non "azzerarlo")
Evitalo, ovvero devi usare degli                if (WiFi.status() == WL_CONNECTED)  allora faccio
my name is IGOR, not AIGOR

khriss75

#13
Aug 23, 2019, 09:39 am Last Edit: Aug 23, 2019, 09:40 am by khriss75
Il delay non avviene quando invio il comando mqtt, ma quando vado a verificare se il client è connesso.
Non sto facendo riferimento ora alla connessione wifi, ma alla connessione tra arduino (esp32) e il broker mqtt.
Forse è meglio se apro un'altra discussione, il titolo ora è fuorviante.


nid69ita

#14
Aug 23, 2019, 10:02 am Last Edit: Aug 23, 2019, 10:09 am by nid69ita
Avevo capito.  Ma la connessione con mqtt può mancare anche se la connessione c'e' ?  Verifica nella libreria mqtt se c'e' un comando per verificare se quella connessione è attiva. Sempre che esista per mqtt un concetto di "connessione" attiva/disattiva.

Non conosco mqtt, ma leggo:
http://www.lucadentella.it/2016/11/19/mqtt-enc28j60-e-adafruit-io/
e vedo funzioni tipo mqttClient.connected()
my name is IGOR, not AIGOR

Go Up