我的目标是打开我的微控制器(esp32-devkit-v1)并让它重新连接到关闭之前连接的最后一个 WiFi。 如果该 SSID 不在范围内,请扫描新的 SSID 并将其列出,以便我可以选择一个新的进行连接。
在下面的代码中,我故意给出了错误的凭据来触发 SSID 列表,但在连接失败后,扫描永远不会被触发。
据我所知,
WiFi.scanNetworks()
永远不会将状态设置为-1,并且永远不会启动扫描(此外,它将uint8_t n;
设置为254)。为了让我不使用与我的问题无关的不必要的内容来填充此查询,我将代码精简为以下内容:
#include <Arduino.h>
#include <WiFi.h>
const char* ssid = "blehbleh";
const char* password = "blahblah";
uint8_t n;
bool connectingToLast() {
Serial.printf("Trying to connect to %s\n", ssid);
WiFi.begin(ssid, password);
int8_t status = WiFi.waitForConnectResult(20000);
if (status != WL_CONNECTED)
{
Serial.printf("Not connected! Err: %i\n", status);
return false;
} else return true;
}
void wifiScan() {
Serial.print("Scanning networks.");
WiFi.scanNetworks(true);
while (WiFi.scanComplete() == -1)
{
delay(500);
Serial.print(".");
}
Serial.println("");
delay(1000);
n = WiFi.scanComplete();
Serial.printf("Amount of networks found: %d\n", n);
for (uint8_t i = 0; i < n; i++)
{
Serial.printf("%2d. %s\n", i+1, WiFi.SSID(i));
}
Serial.println("");
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
if (connectingToLast())
{
Serial.println("Connected!");
}
else
{
WiFi.mode(WIFI_OFF); // IS IT POSSIBLE TO NOT
WiFi.mode(WIFI_STA); // NEED THESE TWO LINES?
wifiScan();
}
}
void loop () {}
如本问题跟踪器中所述,无法连接到 AP,ESP 会通过一遍又一遍地调用其 connect 函数来尝试重新连接。 由于连接优先于扫描,因此永远不会进行扫描。
...
if (status != WL_CONNECTED)
{
Serial.printf("Not connected! Err: %i\n", status);
WiFi.disconnect(); // <-- This dude right here.
return false;
} else return true;
...