Настройте WiFi на ESP8266 в режиме WIFI_AP_STA

Я пытаюсь запрограммировать свою плату 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-адрес клиенту, который подключился к нему перед перезапуском?

Любая помощь приветствуется.

Спасибо!


person Kunal Aggarwal    schedule 30.09.2017    source источник
comment
Если вы переходите из режима станции в режим клиента и предположительно получаете новый IP-адрес, то, конечно, ваше соединение теряется. IP-адрес, к которому был подключен ваш браузер, больше недоступен.   -  person larsks    schedule 30.09.2017
comment
Ах да, прошу прощения, я пропустил эту часть. Я исправлю предоставленный код. Я тоже это включил.   -  person Kunal Aggarwal    schedule 30.09.2017
comment
@larsks Я исправил код, который не переключается в режим только станции при настройке в AP_STA. Только режим STA включается позже.   -  person Kunal Aggarwal    schedule 30.09.2017
comment
Я пытался найти, где это идет не так. Похоже, что точка доступа WiFi сбрасывается после запуска WiFi.begin, потому что мой ноутбук отключается и снова подключается к этой точке доступа, поэтому хром либо показывает, что пункт назначения недоступен, либо было обнаружено изменение сети. Пожалуйста, помогите, почему softAP сбрасывает себя при запуске WiFi.begin? @larsks: Есть идеи?   -  person Kunal Aggarwal    schedule 01.10.2017
comment
Я не уверен. На данный момент у меня нет esp8266 для тестирования.   -  person larsks    schedule 01.10.2017


Ответы (1)