Connexió a múltiples xarxes sense fils
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) {
for (int i = 0; i < N_WIFIS ; i++) {
if (stWiFi[i].szSSID == szSSID)
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 /*&& i++ < 20*/) {
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