Connexió a múltiples xarxes sense fils

De Wiki d'en Jordi Binefa
Dreceres ràpides: navegació, cerca

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