ESP8266 - 以编程方式设置 Wifi 凭据,然后检查它们是否有效,如果无效则更改它们(无需重置)
ESP8266 - Setting Wifi Credentials programmatically and then checking they are valid, and then change them if they are not (without reset)
我有一个 NodeMCU 芯片需要连接到我家的 wifi 和 post 一个 http 请求。我在 WIFI_STA_AP 模式下使用芯片,因为我需要芯片既能通过 http 接受请求,又能通过 http 发出请求。
我不想将我家的 SSID/Password 硬编码到芯片中,所以我编写了一些代码将 ESP (NodeMCU) 置于 AP 模式,通过一个接收 SSID/Pass http 请求并将其保存在 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();
}```
好的,我明白了。必须在 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();
}
我有一个 NodeMCU 芯片需要连接到我家的 wifi 和 post 一个 http 请求。我在 WIFI_STA_AP 模式下使用芯片,因为我需要芯片既能通过 http 接受请求,又能通过 http 发出请求。
我不想将我家的 SSID/Password 硬编码到芯片中,所以我编写了一些代码将 ESP (NodeMCU) 置于 AP 模式,通过一个接收 SSID/Pass http 请求并将其保存在 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();
}```
好的,我明白了。必须在 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();
}