У меня есть чип NodeMCU, который должен подключиться к моему домашнему Wi-Fi и опубликовать http-запрос. Я использую микросхему в режиме WIFI_STA_AP , поскольку мне нужно, чтобы микросхема принимала запросы через http и отправляла запросы по http.
Я не хочу жестко кодировать SSID / пароль моего дома в чип, поэтому я написал некоторый код, который переводит ESP (NodeMCU) в режим AP, получает SSID / Pass через запрос http и сохраняет его в EEPROM.
Это прекрасно работает.
В приведенном ниже коде onTestWifi () вызывается, когда я звоню http://192.168.4.1/test_wifi?wifi_ssid=mySsid&wifi_password=myPassword , Ssid и пароль предоставляются для функции WiFi.begin () . Однако, если я случайно введу неверный пароль и воспользуюсь им в WiFi.begin () , соединение всегда будет прерываться до сброса чипа, а затем будет введен правильный пароль.
Что такое Я пропал? Можно ли программно изменить учетные данные Wi-Fi ESP без перезагрузки чипа? Сброс микросхемы приводит к отключению клиента (в случае приложения 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();
}```