Diferència entre revisions de la pàgina «Connexió a múltiples xarxes sense fils»
(Es crea la pàgina amb «= Connexió a múltiples xarxes sense fils emprant l'ESP8266 = Quan un dispositiu basat en l'ESP8266 pot estar indistintament en diverses xarxes (a la feina, a l'esco...».) |
|||
(Hi ha 2 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 1: | Línia 1: | ||
= Connexió a múltiples xarxes sense fils emprant l'ESP8266 = | = Connexió a múltiples xarxes sense fils emprant l'ESP8266 = | ||
− | Quan un dispositiu basat en l'ESP8266 pot estar indistintament en diverses xarxes (a la feina, a l'escola, a casa) ens interessa no haver d' | + | Quan un dispositiu basat en l'ESP8266 pot estar indistintament en diverses xarxes (a la feina, a l'escola, a casa) ens interessa no haver d'actualitzar el microprogramari (firmware) per a canviar la SSID, i contrasenya, cada cop que canviem de lloc. |
Una solució és definir una estructura amb la SSID i la contrasenya, per després fer un vector d'estructures amb les diferents acreditacions per a cada xarxa: | Una solució és definir una estructura amb la SSID i la contrasenya, per després fer un vector d'estructures amb les diferents acreditacions per a cada xarxa: | ||
Línia 16: | Línia 16: | ||
Per saber totes les xarxes sense fils disponibles es pot fer servir '''WiFi.scanNetworks()''' i es pot comparar el camp '''szSSID''' de cada element del vector d'estructures '''stWifiList''' amb '''WiFi.SSID(i)''' per verificar si coincideixen. Un cop s'ha identificat una xarxa sense fils present al vector '''stWiFi[N_WIFIS]''' es procedeix a fer la connexió amb '''WiFi.begin(ssid, pwd)'''. | Per saber totes les xarxes sense fils disponibles es pot fer servir '''WiFi.scanNetworks()''' i es pot comparar el camp '''szSSID''' de cada element del vector d'estructures '''stWifiList''' amb '''WiFi.SSID(i)''' per verificar si coincideixen. Un cop s'ha identificat una xarxa sense fils present al vector '''stWiFi[N_WIFIS]''' es procedeix a fer la connexió amb '''WiFi.begin(ssid, pwd)'''. | ||
− | boolean bIsListed(String szSSID) { | + | boolean bIsListed(String szSSID, int *pnWhichOne) { |
for (int i = 0; i < N_WIFIS ; i++) { | for (int i = 0; i < N_WIFIS ; i++) { | ||
− | if (stWiFi[i].szSSID == szSSID) | + | if (stWiFi[i].szSSID == szSSID){ |
+ | *pnWhichOne = i; | ||
return true; | return true; | ||
+ | } | ||
} | } | ||
return false; | return false; | ||
Línia 30: | Línia 32: | ||
WiFi.begin(ssid, pwd); | WiFi.begin(ssid, pwd); | ||
Serial.println("Waiting for WIFI connection..."); | Serial.println("Waiting for WIFI connection..."); | ||
− | while (WiFi.status() != WL_CONNECTED | + | while ( WiFi.status() != WL_CONNECTED ) { |
Serial.print("."); | Serial.print("."); | ||
vDelayESP8266(500); | vDelayESP8266(500); | ||
Línia 44: | Línia 46: | ||
} else { | } else { | ||
for (int i = 0; i < n; ++i) { | for (int i = 0; i < n; ++i) { | ||
− | if (bIsListed(WiFi.SSID(i | + | if (bIsListed(WiFi.SSID(i), &nWhichOne)) { |
vConnectToWiFi(stWiFi[nWhichOne].szSSID, stWiFi[nWhichOne].szPWD); | vConnectToWiFi(stWiFi[nWhichOne].szSSID, stWiFi[nWhichOne].szPWD); | ||
return true; | return true; |
Revisió de 13:30, 23 maig 2018
Connexió a múltiples xarxes sense fils emprant l'ESP8266
Quan un dispositiu basat en l'ESP8266 pot estar indistintament en diverses xarxes (a la feina, a l'escola, a casa) ens interessa no haver d'actualitzar el microprogramari (firmware) per a canviar la SSID, i contrasenya, cada cop que canviem de lloc.
Una solució és definir una estructura amb la SSID i la contrasenya, per després fer un vector d'estructures amb les diferents acreditacions per a cada xarxa:
#define N_WIFIS 2 struct stWifiList { String szSSID; String szPWD; }; struct stWifiList stWiFi[N_WIFIS] = { {"SSID_1" , "PWD_1"}, {"SSID_2" , "PWD_2"} };
Per saber totes les xarxes sense fils disponibles es pot fer servir WiFi.scanNetworks() i es pot comparar el camp szSSID de cada element del vector d'estructures stWifiList amb WiFi.SSID(i) per verificar si coincideixen. Un cop s'ha identificat una xarxa sense fils present al vector stWiFi[N_WIFIS] es procedeix a fer la connexió amb WiFi.begin(ssid, pwd).
boolean bIsListed(String szSSID, int *pnWhichOne) { for (int i = 0; i < N_WIFIS ; i++) { if (stWiFi[i].szSSID == szSSID){ *pnWhichOne = i; return true; } } return false; } void vConnectToWiFi(String szSsid, String szPwd) { char ssid[MAX_STRING_SIZE], pwd[MAX_STRING_SIZE]; szSsid.toCharArray(ssid, szSsid.length() + 1); szPwd.toCharArray(pwd, szPwd.length() + 1); Serial.println("Connecting to WiFi network: " + String(ssid)); WiFi.begin(ssid, pwd); Serial.println("Waiting for WIFI connection..."); while ( WiFi.status() != WL_CONNECTED ) { Serial.print("."); vDelayESP8266(500); } Serial.println(); } boolean bTryWifiConnection() { int n = WiFi.scanNetworks(), nWhichOne; Serial.print("*"); if (n == 0) { Serial.println("\nNo networks found"); vDelayESP8266(1000); } else { for (int i = 0; i < n; ++i) { if (bIsListed(WiFi.SSID(i), &nWhichOne)) { vConnectToWiFi(stWiFi[nWhichOne].szSSID, stWiFi[nWhichOne].szPWD); return true; } } } return false; }
Us podeu descarregar un codi funcional a esp8266_multipleWifi.ino