ESP8266 - Настройка учетных данных Wifi программно, а затем проверка их действительности, а затем изменение их, если они не (без сброса) - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть чип 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();
}```

1 Ответ

0 голосов
/ 26 февраля 2020

ОК, так что я понял это. Пришлось добавить строку WiFi.disconnect (true) в функцию onTestWifi () . Видимо он отключается от сети и стирает учетные данные. Этот материал очень плохо документирован, и я потратил на это дни. Я надеюсь, что кто-то найдет это полезным.

#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();
}
...