Я пытаюсь запрограммировать свою плату NodeMCU (Lolin v3) таким образом, чтобы использовать ее для настройки параметров Wi-Fi без необходимости жесткого ввода учетных данных. Я знаю, что есть библиотека WiFiManager, но я не собираюсь ее использовать, так как мне нужно сделать свою собственную реализацию, а не использовать пользовательский интерфейс, который предоставляет библиотека. Учетные данные, предоставленные пользователем, сохраняются в файле с использованием SPIFFS и используются для проверки запуска платы в режиме AP_STA или только в режиме STA.
Ниже приведена логика, которую я использую:
void connectWiFi(String ssid, String password, boolean staOnly = false) {
boolean state = true;
int i = 0;
if(staOnly)
WiFi.mode(WIFI_STA);
WiFi.begin(ssid.c_str(), password.c_str());
while (WiFi.status() != WL_CONNECTED) {
delay(500);
if (i > 10) {
state = false;
break;
}
i++;
}
return state;
}
void join() {
String ssid = setupServer.arg("ssid");
String password = setupServer.arg("password");
result = connectWifi(ssid, password);
if(result) {
Serial.println("Connected");
// **THIS IS THE PROBLEMATIC PART**
setupServer.send(200, "text/plain", WiFi.localIP().toString());
// save credentials to a file
Serial.println("Conf saved");
delay(2000);
ESP.restart();
} else
setupServer.send(200, "text/plain", "fail");
}
void setup() {
Serial.begin(115200);
WiFi.disconnect(true);
boolean fileExists = SPIFFS.exists(WIFI_CONF_FILE);
if(!fileExists) {
WiFi.mode(WIFI_AP_STA);
WiFi.softAP("AP", "password");
IPAddress myIP = WiFi.softAPIP();
setupServer = ESP8266WebServer(myIP, 8888);
setupServer.on("/join", join);
setupServer.begin();
} else {
// read file contents for ssid and password
connectWifi(ssid, password, true);
// do some work here
}
}
void loop() {
setupServer.handleClient();
}
Итак, теперь, когда я делаю новую загрузку, плата переходит в режим AP_STA и начинает с SSID AP. Подключаюсь к нему и открываю http://192.169.4.1/join?ssid=mywifi&password=12345678
в браузере. Каким-то образом соединение прерывается, и в моем браузере появляется сообщение «Пункт назначения недоступен». Но последовательный монитор печатает «Подключено» и «Конфигурация сохранена».
Я хочу знать, почему он не возвращает ответ об успехе в браузере. Мне нужен локальный IP после подключения к WiFi. Он корректно возвращает ошибочный ответ в случае сбоя. Как я могу гарантировать, что он всегда будет возвращать назначенный ему IP-адрес клиенту, который подключился к нему перед перезапуском?
Любая помощь приветствуется.
Спасибо!