网站搜索

使用 WiFiMulti 函数连接到 ESP32 上最强的 WiFi 网络


ESP32是一款基于物联网的微控制器板,具有WiFi和蓝牙支持。ESP32可以在三种不同的WiFi模式下工作(Station、Access或两者都支持)。通过使用所有这些模式,ESP32可以大幅增强其无线连接能力。今天我们将讨论ESP32的多WiFi支持,以连接到最强大的可用网络。

带WiFiMulti功能的ESP32

如果我们可以访问多个网络,ESP32 可以连接到多个网络,我们只需在代码中定义它们的 SSID 和密码。它将搜索可用的网络,并连接到我们在代码中定义的最强 Wi-Fi 网络。

注意: 请记住,它一次只能连接到一个网络,如果与该网络的连接丢失,则ESP32将连接到其他可用的WiFi网络。

我们可以在Arduino IDE中打开WiFiMulti示例:

转到: 文件 > 示例 > WiFi > WifiMulti

如何在ESP32中添加多个WiFi网络

在ESP32板中添加多个WiFi网络。我们将使用WifiMulti函数和addAP()。addAP()函数可以接受多个SSID和密码作为参数。要添加多个网络,它们的SSID和密码应该分别定义。以下是使用WifiMulti函数和addAP()添加多个网络的语法:

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

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

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

如何在ESP32中连接到最强的WiFi网络

为了将ESP32连接到最强的可用网络,我们将结合ESP32 WiFi扫描和WiFi多连接的例子。我们将在Arduino IDE中编写代码,执行以下步骤:

  • 扫描可用网络
  • 在串行监视器上打印它们的RSSI(信号强度)。这样,我们可以检查最强的可用网络。
  • 自动连接到最强网络
  • 如果它失去连接,它将自动连接到下一个可用的最强网络。

为了测试代码,我们将使用一个智能手机热点和一个WiFi网络。始终给手机热点网络分配一个简单的名称,以避免任何错误。

现在使用 Arduino IDE 上传给定的代码到 ESP32 板上。

代码

打开 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);
}

代码首先定义了 ESP32 的 WiFi 库,然后我们创建了一个 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值为-65。

结论

ESP32可以连接到其周围可用的最强网络。我们只需要在代码中定义多个网络的SSID和密码。使用WiFiMulti函数,ESP32将扫描可用网络,当连接丢失时,它将连接到ESP32范围内的其他可用网络。