我可以从无法连接到扫描 ssid,而无需在中间关闭和重新打开 wifi 吗?

问题描述 投票:0回答:1

我的目标是打开我的微控制器(esp32-devkit-v1)并让它重新连接到关闭之前连接的最后一个 WiFi。 如果该 SSID 不在范围内,请扫描新的 SSID 并将其列出,以便我可以选择一个新的进行连接。

问题

在下面的代码中,我故意给出了错误的凭据来触发 SSID 列表,但在连接失败后,扫描永远不会被触发。

据我所知,

WiFi.scanNetworks()
永远不会将状态设置为-1,并且永远不会启动扫描(此外,它将
uint8_t n;
设置为254)

如果我希望一切按预期工作,我需要在扫描之前关闭并再次打开 WiFi。

为了让我不使用与我的问题无关的不必要的内容来填充此查询,我将代码精简为以下内容:

#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 () {}
c++ esp32 arduino-esp32
1个回答
0
投票

如本问题跟踪器中所述,无法连接到 AP,ESP 会通过一遍又一遍地调用其 connect 函数来尝试重新连接。 由于连接优先于扫描,因此永远不会进行扫描。

修复
一旦与 AP 的连接尝试失败,只需简单地调用断开连接即可成功扫描。
...
if (status != WL_CONNECTED)
  {
    Serial.printf("Not connected! Err: %i\n", status);
    WiFi.disconnect(); //    <--   This dude right here.
    return false;
  } else return true;
...
© www.soinside.com 2019 - 2024. All rights reserved.