ESP8266-以编程方式设置Wifi凭据,然后检查它们是否有效,如果无效则更改它们(无需重置)



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

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

这很管用。

在下面的代码中,当我调用时,会调用onTestWifi((http://192.168.4.1/test_wifi?wifi_ssid=mySsid&wifi_password=myPassword。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();
}```

好吧,所以我想明白了。必须在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();
}

相关内容

最新更新