ESP8266 каким-то образом запоминает данные доступа к Wi-Fi?

Сегодня я немного повозился с ESP8266, опробовал OTA и написал веб-сервер. Чтобы найти ошибку, я сократил эскиз до следующих строк:

#include <ESP8266WebServer.h>

ESP8266WebServer server(80);

void setup() {
  Serial.begin(115200);
  server.on("/", []() {
    Serial.println("Sending response...");
    server.send(200, "text/plain", "Hi there!");
  });
  server.begin();
}

void loop() {
  server.handleClient();
}

Обратите внимание, что код для подключения к сети Wi-Fi отсутствует. Однако чип по-прежнему подключается к моей локальной сети, защищенной WPA2, при каждой загрузке. Я могу пропинговать чип, мой браузер может получить сообщение «Привет!» сообщение через http, последовательное сообщение печатается.

Как это возможно? Сохраняет ли ESP8266 информацию о Wi-Fi каким-то образом, возможно, из-за некоторых старых данных OTA, которые не были полностью перезаписаны?

Я использую Platformio. Вот весь мой файл Platformio.ini:

[env:d1_mini]
platform = espressif8266
board = d1_mini
framework = arduino

Я разместил журнал компиляции и загрузки здесь: https://pastebin.com/BtGrFZiu

, 👍12


1 ответ


Лучший ответ:

15

Да, обычно последние учетные данные Wi-Fi сохраняются во флэш-памяти, и ESP8266 загружает эти данные при загрузке и повторно подключается к последнему известному Wi-Fi. См. https://github.com/esp8266/Arduino/issues/2843#issuecomment-334250100. :

SDK хранит некоторую информацию, включая учетные данные Wi-Fi, в секторе флэш-памяти.

Этот сектор сохраняется между перепрошивками, чтобы обеспечить быстрый запуск после обновления. При загрузке, прежде чем ваш эскиз будет выполнен, SDK получит учетные данные Wi-Fi и попытается быстро подключиться.

Этим поведением можно управлять с помощью функции WiFi.setAutoConnect(autoConnect), как описано в https://github.com/esp8266/Arduino/blob/master/doc/esp8266wifi/station-class.rst#setautoconnect. Это, в свою очередь, вызывает функцию Espressif SDK wifi_station_set_auto_connect (ссылка на API)

Коротко: это нормальное поведение. Если вы хотите убедиться, что ваш ESP8266 не подключается к какому-либо Wi-Fi, если вы не укажете ему сделать это явно, вызовите WiFi.setAutoConnect(autoConnect) в начале.

Изменить: из кода прошивки вы можете использовать system_restore. В документации говорится, что он сбросит данные, связанные с Wi-Fi. Это должно уничтожить предыдущие настройки. Эту функцию можно включить из https://github.com/esp8266/Arduino/. blob/master/tools/sdk/include/user_interface.h в Arduino-ESP8266. Я сам не пробовал и не могу сказать, что это действительно стирает критически важную для безопасности информацию с флэш-памяти.

abc

Или, как вы также узнали, принудительное стирание всей флэш-памяти с абсолютной уверенностью удалит данные Wi-Fi. Этого можно добиться, используя esptool.py с опцией erase_flash, например, python esptool.py -p COM6 Erase_flash. Затем вы можете прошить новую прошивку, которая не будет использовать предыдущие настройки Wi-Fi (но, вероятно, снова откроет точку доступа по умолчанию).

А еще есть ESP.eraseConfig который стирает только соответствующие сектора флэш-памяти.

,

Спасибо. Есть ли способ стереть ранее установленные учетные данные из флэш-памяти? РЕДАКТИРОВАТЬ: Обнаружено, что это возможно с помощью esptool: https://www.esp8266.com/viewtopic.php?f=32&t=8204., @Geier

@Geier обновлен., @Maximilian Gerhardt

WiFi.disconnect() также удаляет запомненные учетные данные., @Juraj