我有一个 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();
}```