Свържете се с най-силната WiFi мрежа в ESP32, използвайки функцията WiFiMulti


ESP32 е микроконтролерна дъска, базирана на IoT, с поддръжка на WiFi и Bluetooth. ESP32 може да работи в три различни режима на WiFi (Клиент, Достъп или и двата). Използвайки всички тези режими, ESP32 може да подобри безжичното си свързване многократно. Днес ще обсъждаме поддръжката на много WiFi в ESP32, за да се свържем с най-силната налична мрежа.

ESP32 с функция WiFiMulti

ESP32 може да се свързва с множество мрежи, ако имаме достъп до повече от една мрежа, просто трябва да определим техните SSID и парола в кода. Той ще търси наличната мрежа и ще се свърже с най-силната Wi-Fi мрежа, която определим в кода.

Забележка: Запомнете, че той ще се свързва с една мрежа наведнъж. Ако връзката с тази мрежа бъде загубена, ESP32 ще се свърже с други налични WiFi мрежи.

Можем да отворим примера WiFiMulti в Arduino IDE:

Отидете на: Файл > Примери > WiFi > WifiMulti

Как да добавите множество WiFi мрежи в ESP32

За да добавите множество WiFi мрежи в платката ESP32. Ще използваме функцията WifiMulti с addAP(). Функцията addAP() може да приеме множество SSID и пароли като аргумент. За да добавите множество мрежи, техните SSID и пароли трябва да бъдат определени отделно. Следва синтаксисът за добавяне на повече от една мрежа с функцията WifiMulti и addAP():

wifiMulti.addAP("SSID Network1", "Password1");

wifiMulti.addAP("SSID Network2", " Password2");

wifiMulti.addAP("SSID Network3", " Password3");

Как да се свържете с най-силната WiFi мрежа в ESP32

За да свържем ESP32 с най-силната налична мрежа, ще комбинираме сканирането на WiFi от ESP32 и примера за WiFi многократност. Ще напишем код в Arduino IDE, който ще изпълни следните стъпки:

  • Сканирайте за наличните мрежи
  • Изведете техния RSSI (интензивност на сигнала) на сериен монитор. Така можем да проверим най-силната налична мрежа.
  • Автоматично се свързва с най-силната мрежа
  • Ако изгуби връзка, автоматично ще се свърже с следващата налична най-силна мрежа.

За да тестваме кода, ще използваме гореща точка от смартфон и WiFi мрежа. Винаги задавайте просто име на мрежата с гореща точка, за да избегнете грешки.

Сега качете кода, предоставен в ESP32 платката, използвайки Arduino IDE.

Код

Отворете Arduino IDE и качете кода в ESP32. Не забравяйте да изберете COM порта.

#include <WiFi.h> /*WIFI library included*/

#include <WiFiMulti.h> /*Multi WIFI library included*/

WiFiMulti wifiMulti;
/*Per AP connect time. Increase when ESP32 take more time for connection*/ 
const uint32_t connectTimeoutMs = 10000;
void setup(){
  Serial.begin(115200);  /*Serial communication begins*/
  delay(10);
  WiFi.mode(WIFI_STA);    /*ESP32 WIFI initialized as Station*/
  /*Type all known SSID and their passwords*/
  wifiMulti.addAP("YOUR SSID", "PASSWORD");  /*Network 1 we want to connect*/
  wifiMulti.addAP("phone");  /*Network 2 we want to connect*/
  // WiFi.scanNetworks will give total networks
  int n = WiFi.scanNetworks();  /*Scan for available network*/
  Serial.println("scan done");  
  if (n == 0) {
      Serial.println("No Available Networks");  /*Prints if no network found*/
  } 
  else {
    Serial.print(n);
    Serial.println(" Networks found");  /*Prints if network found*/
    for (int i = 0; i < n; ++i) {
      Serial.print(i + 1);  /*Print the SSID and RSSI of available network*/
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
      delay(10);
    }
  }
 /*Connects to strongest available defined network with SSID and Password available*/
   Serial.println("Connecting to Wifi..."); 
  if(wifiMulti.run() == WL_CONNECTED) {
    Serial.println("");
    Serial.println("Connected to WIFI Network");
    Serial.println("IP address of Connected Network: ");
    Serial.println(WiFi.localIP());    /*Prints IP address of connected network*/
  }
}
void loop(){
   if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED) {  /*if the connection lost it will connect to next network*/
    Serial.print("WiFi connected: ");
    Serial.print(WiFi.SSID());
    Serial.print(" ");
    Serial.println(WiFi.RSSI());
  }
  else {
    Serial.println("WiFi not connected!");  /*if all conditions fail print this*/
  }
  delay(1000);
}

Кодът започна с дефиниране на WiFi библиотеки за ESP32, след което създадохме WiFiMulti обект. След това, в частта за настройка, добавихме две мрежи. Едната е WiFi мрежа, която е с парола, така че трябва да предоставим парола, докато втората мрежа, която е хотспот на смартфон, е отворена, така че не ни трябва парола, просто написахме SSID на мрежата.

Следващото, използвайки командата wifiMulti.run(), ESP32 ще се свърже с наличната най-силна мрежа. След като WiFi е свързана, кодът ще отпечата SSID на свързаната мрежа, IP адреса и RSSI.

Изход

След като качите кода на ESP32, той първо ще сканира за наличната мрежа, след което ще се свърже с най-силната налична мрежа. Тук можем да видим стойността на RSSI за всяка мрежа; по-нисък RSSI означава по-силна мрежа.

Можем да видим, че ESP32 е свързан към мобильната мрежа, защото има стойност на RSSI -62, а другата мрежа, чийто SSID и парола са определени, е Team SAM, чиято стойност е -73. Тук мрежата на мобилния хотспот има стойност на RSSI, която е по-близо до нула, което означава по-силна връзка.

Сега отключете хотспота на смартфона. ESP32 ще се свърже сам с други по-силни налични мрежи. Както виждаме в изхода, ESP32 вече е свързан към следващата най-силна налична мрежа. Мрежата, към която е свързан, е Team SAM с RSSI стойност 0f -65.

Заключение

ESP32 може да се свърже с най-силната налична мрежа в своята обкръжение. Просто трябва да дефинираме множество мрежи SSID и пароли в кода. Използвайки функцията WiFiMulti, ESP32 ще сканира наличните мрежи и когато връзката бъде изгубена, ще се свърже с други налични мрежи в обхвата на ESP32.