0

我有一个 NodeMCU 芯片,需要连接到我的家庭 wifi 并发布一个 http 请求。我在WIFI_STA_AP模式下使用芯片,因为我需要芯片通过 http 接受请求并通过 http 发出请求。

我不想将我家的 SSID/密码硬编码到芯片中,所以我编写了一些代码,将 ESP(NodeMCU)置于 AP 模式,通过 http 请求接收 SSID/Pass 并将其保存在 EEPROM 中。

这很好用。

在下面的代码中,当我调用http://192.168.4.1/test_wifi?wifi_ssid=mySsid&wifi_password=myPassword时会调用onTestWifi()。ssid 和密码提供给WiFi.begin()函数。但是,如果我不小心输入了错误的密码并在WiFi.begin()中使用它,连接将始终失败,直到重置芯片然后插入正确的密码。

我错过了什么?是否可以通过编程方式更改 ESP 的 wifi 凭据,而无需重置芯片?重置芯片会导致客户端(在这种情况下是 iPhone 应用程序)与芯片断开连接,这会破坏整个程序流程。

这是我正在使用的实验代码:

#include <ESP8266WiFiMulti.h>
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

ESP8266WebServer server(80);
ESP8266WiFiMulti WiFiMulti;

void setup() {
  Serial.begin(115200);
  Serial.println("");
  delay(100);
  Serial.println("Starting...");
  WiFi.persistent(false);
  WiFi.mode(WIFI_AP_STA);
  WiFi.softAP("APSSID");
  IPAddress ip = WiFi.softAPIP();
  server.on("/test_wifi", onTestWifi);
  server.begin();
  yield();
}

void onTestWifi()
{
  char ssid[30] = "";
  char password[30] = "";
  for (int i = 0; i < server.args(); i++)
  {
    String n = server.argName(i);
    String v = server.arg(i);
    if (n == "wifi_ssid")
      v.toCharArray(ssid, 30);
    else if (n == "wifi_password")
      v.toCharArray(password, 30);
    yield();
  }
  Serial.print("Connecting to: ");
  Serial.print(ssid);
  Serial.print(" ");
  Serial.println(password);
  delay(100);
  WiFi.begin(ssid, password);
  yield();
  int counter = 0;
  while (WiFi.status() != WL_CONNECTED && counter < 10)
  { // Wait for the Wi-Fi to connect
    delay(1000);
    Serial.print(++counter);
    Serial.print(' ');
  }

  if (WiFi.status() != WL_CONNECTED)
  { // Failed to connect.
    Serial.println("Connection failed!");

  }
  else {
    Serial.println("Connection succeeded!");
  }
  yield();
}

void loop() {
  server.handleClient();
}```

4

1 回答 1

1

好的,所以我想通了。必须在onTestWifi()函数中添加WiFi.disconnect(true)行。显然,它会断开网络连接并删除凭据。这些东西的文档记录很差,我在上面浪费了很多天。我希望有人觉得它有用。

#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

ESP8266WebServer server(80);
ESP8266WiFiMulti WiFiMulti;

void setup() {
  Serial.begin(115200);
  Serial.println("");
  delay(100);
  Serial.println("Starting...");
  WiFi.persistent(false);
  WiFi.mode(WIFI_AP_STA);
  WiFi.softAP("APSSID");
  IPAddress ip = WiFi.softAPIP();
  server.on("/test_wifi", onTestWifi);
  server.begin();
  yield();
}

void onTestWifi()
{
  char ssid[30] = "";
  char password[30] = "";
  for (int i = 0; i < server.args(); i++)
  {
    String n = server.argName(i);
    String v = server.arg(i);
    if (n == "wifi_ssid")
      v.toCharArray(ssid, 30);
    else if (n == "wifi_password")
      v.toCharArray(password, 30);
    yield();
  }
  Serial.print("Connecting to: ");
  Serial.print(ssid);
  Serial.print(" ");
  Serial.println(password);
  delay(100);
  WiFi.begin(ssid, password);
  yield();
  int counter = 0;
  while (WiFi.status() != WL_CONNECTED && counter < 10)
  { // Wait for the Wi-Fi to connect
    delay(1000);
    Serial.print(++counter);
    Serial.print(' ');
  }

  if (WiFi.status() != WL_CONNECTED)
  { // Failed to connect.
    Serial.println("Connection failed!");
  }
  else {
    Serial.println("Connection succeeded!");
  }
  WiFi.disconnect(true); // <--- Added this line
  yield();
}

void loop() {
  server.handleClient();
}
于 2020-02-26T17:43:00.570 回答