FYI, you probable want to wait for this bug fix:
https://github.com/espressif/esp-idf/issues/8269
Establish WiFi connection to AP with strongest radio signal
-
- Posts: 53
- Joined: Sat Feb 22, 2020 8:16 pm
Re: Establish WiFi connection to AP with strongest radio signal
You can adapt ESP32 built-in WiFiMulti example to see if OK for you.
You can also try my WiFiMulti_Generic Library, which is designed to help many boards, including ESP32, to connect to one of your pre-selected SSIDs with the best RSSI.
You can also try my WiFiMulti_Generic Library, which is designed to help many boards, including ESP32, to connect to one of your pre-selected SSIDs with the best RSSI.
Re: Establish WiFi connection to AP with strongest radio signal
Thanks to @Thomas Peter for his solution which I modified slightly in order to not rely on the ESP's sorting order and therefore possibly also solving @kristian32's issue. Here's the function I'm using now. It requires wifi_ssid and wifi_pass to be global variables and returns the connected BSSID as string:
I have tested the code with reverse conditions (i.e. to connect to the weakest signal) and it works this way, too ...
Code: Select all
String scanAndConnectToStrongestNetwork() {
int i_strongest = -1;
int32_t rssi_strongest = -100;
Serial.printf("Start scanning for SSID %s\r\n", wifi_ssid);
int n = WiFi.scanNetworks(); // WiFi.scanNetworks will return the number of networks found
Serial.println("Scan done.");
if (n == 0) {
Serial.println("No networks found!");
return ("");
} else {
Serial.printf("%d networks found:", n);
for (int i = 0; i < n; ++i) {
// Print SSID and RSSI for each network found
Serial.printf("%d: BSSID: %s %2ddBm, %3d%% %9s %s\r\n", i, WiFi.BSSIDstr(i).c_str(), WiFi.RSSI(i), constrain(2 * (WiFi.RSSI(i) + 100), 0, 100), (WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? "open" : "encrypted", WiFi.SSID(i).c_str());
if ((String(wifi_ssid) == String(WiFi.SSID(i)) && (WiFi.RSSI(i)) > rssi_strongest)) {
rssi_strongest = WiFi.RSSI(i);
i_strongest = i;
}
}
}
if (i_strongest < 0) {
Serial.printf("No network with SSID %s found!\r\n", wifi_ssid);
return ("");
}
Serial.printf("SSID match found at %d. Connecting...\r\n", i_strongest);
WiFi.begin(wifi_ssid, wifi_pass, 0, WiFi.BSSID(i_strongest));
return (WiFi.BSSIDstr(i_strongest));
}
Who is online
Users browsing this forum: No registered users and 57 guests