Diferència entre revisions de la pàgina «Connexió a múltiples xarxes sense fils»

De Wiki d'en Jordi Binefa
Dreceres ràpides: navegació, cerca
(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'actualitza el microprogramari (firmware) per a canviar la SSID, i contrasenya, cada cop que canviem de lloc.
+
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 /*&& i++ < 20*/) {
+
   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)), &nWhichOne) {
+
       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