• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Где ESP хранит настройки SSID и Password?

valerivp

Member
и как туда еще что-то добавить?

EEPROM - мне не понятно.
Есть функция begin(X)
X - указывает размер. Я так понял он этот весь кусок сразу и запишет потом? а я хочу не сначала если?
 

pvvx

Активный участник сообщества
"SSID и Password" ESP8266 хранит в последних 2-х секторах Flash. 3-й сектор имеет разметку в каком из двух хранятся настройки WiFi.
Про это всё описано в документации.
 

valerivp

Member
"SSID и Password" ESP8266 хранит в последних 2-х секторах Flash. 3-й сектор имеет разметку в каком из двух хранятся настройки WiFi.
Про это всё описано в документации.
Спасибо. Возможно в документации все написано. Но не всегда понятно что именно искать.

Правильно ли я понимаю, что эта Flash и SPIFFS одно и то же место? или SPIFFS занимает не все возможное место? или тоже есть в документации?
 

pvvx

Активный участник сообщества
Правильно ли я понимаю, что эта Flash и SPIFFS одно и то же место? или SPIFFS занимает не все возможное место? или тоже есть в документации?
SPIFFS это отдельная часть. Сохранение настроек WiFi - это внутренняя функциональность функций SDK, на которых построена Arduino. При переключении режимов или соединении с другой AP и т.д. настройки WiFi автоматически записываются в указанные 3 последних сектора. Так-же при каждом новом старте. Если вы применяете deep-sleep или частые перезагрузки, то дырка в Flash возможна через год работы такого устройства - погибнут эти 3 сектора.
 

kab

New member
Flash и SPIFFS одно и то же место?
Flash - это микросхема внешней памяти. На ней:
1. Хранится сама запускаемая программа - "прошивка"
2. Размещаются данные, используемые системой автоматически, в т. ч. имя и пароль точки доступа последнего успешного коннекта.
3. Кроме этого, программист имеет возможность частью этой памяти распорядится по своему усмотрению. Два самых распространённых способа реализованы в подключаемых библиотеках EPROM и SPIFFS.

Как-то так (с) - :)
 

kab

New member

kab

New member
Так-же при каждом новом старте. Если вы применяете deep-sleep или частые перезагрузки, то дырка в Flash возможна через год работы такого устройства - погибнут эти 3 сектора.
Ребята тут на форуме приводили тексты этой функциональности - реально перезапись конфига идет, только если какие-либо данные меняются.
 

pvvx

Активный участник сообщества
Ребята тут на форуме приводили тексты этой функциональности - реально перезапись конфига идет, только если какие-либо данные меняются.
Угу - они в Arduino всегда меняются - при старте устанавливается режим и прочие настройки. Не все настройки для нормальной работы ставятся по умолчанию и это требует изменения. Ну если у вас просто "Hello, world!" то ничего и не перезаписывается.
Посмотреть кол-во перезаписей очень просто - в заголовке структуры этих секторов есть счетчик.
В SDK сделаны доп. процедуры, которые ставят настройки WiFi без записи. Простейшего сравнения, что пишется то-же самое Espressif не сделал. Корме того, если в сохранении будет сбоить хоть один бит, то стирание-запись будет идти по кругу, пока гарантированно не убьет этот сектор во Flash. Такое возможно при просадке напряжения питания. В общем это фича такая, чтобы покупали новый модуль :)
И таких китайских фич более тысячи в SDK 2.0.0. Сотню совсем страшных, с первых версий убрали. Если судить по темпам "оптимазе" путем добавления дублей процедур с исправлениями от Espressif в новых версиях, то наверно потребуется ещё десятки лет до устранения хотя-бы половины кривых алго и прошивка (коды) вылезет за размеры XIP (1МБ)... Первые и кое-как работающие версии типа SDK 0.9.2 вмещались в 256 килобайт Flash.
 
Последнее редактирование:

enjoynering

Well-known member
Если вы применяете deep-sleep или частые перезагрузки, то дырка в Flash возможна через год работы такого устройства - погибнут эти 3 сектора.
Вот тут вы не правы. Arduino core for ESP8266 проверяет на совпадении пароль/имя точки перед записью. Так что дырки не будет.
 

enjoynering

Well-known member
А будет ли переписываться FLASH если стоит WiFi.persistent(false) ?
первый же запрос в гугл дает развернутый ответ - Documentation for WiFi.persistent() is misleading · Issue #3641 · esp8266/Arduino · GitHub

It writes settings to flash if they don't match the values in flash if persistent is set to true. If it is false it will not write to flash independent of the current value in flash.
вас в гугле забанили?
 

dmn240

New member
"SSID и Password" ESP8266 хранит в последних 2-х секторах Flash. 3-й сектор имеет разметку в каком из двух хранятся настройки WiFi.
Про это всё описано в документации.
если не затруднит ткните в меня местом в документации. мне нужно принудительно записать ssid/ без pass значения предварительного коннекта (надеюсь такое возможно принципиально)
 

pvvx

Активный участник сообщества
если не затруднит ткните в меня местом в документации. мне нужно принудительно записать ssid/ без pass значения предварительного коннекта (надеюсь такое возможно принципиально)
Такого в доках не встречал. (Я уже давно расстался с глюкогдромом ESP8266 - возможно в новых доках что-то и есть и кто другой ответит)
Вот тут вы не правы. Arduino core for ESP8266 проверяет на совпадении пароль/имя точки перед записью. Так что дырки не будет.
А другие настройки она тоже проверяет? Там сохраняется не только пароль и имя, а более 1.5 килобайта всякой ерунды...
Например калибровки. Они при старте переписываются, а без них модуль работает неверно на разной температуре :p
Ещё смотрите зависимости от версии SDK.
 

nikolz

Well-known member
если не затруднит ткните в меня местом в документации. мне нужно принудительно записать ssid/ без pass значения предварительного коннекта (надеюсь такое возможно принципиально)
например для станции делаем в самом начале так:
Код:
#define SSID "nik"
#define PASSWORD "nikolz"
struct station_config stationConf;
//------------------------------------------------
wifi_station_get_config (&stationConf);
uint8 e1=strcmp(stationConf.ssid, SSID);
uint8 e2=strcmp(stationConf.password, PASSWORD);
//------------------------------------------
    if ((e1!=0) ||(e2!=0)){
         ets_strcpy(stationConf.ssid,SSID);
        ets_strcpy(stationConf.password,PASSWORD);
    wifi_station_set_config(&stationConf);
}
 

enjoynering

Well-known member
на arduino делаем так

Код:
  if   (WiFi.SSID() == staConfig.ssid || WiFi.psk() == staConfig.password) WiFi.begin();  //start station with saved credentials
  else WiFi.begin(staConfig.ssid.c_str(), staConfig.password.c_str()); //start station with new credentials
 

nbouda

New member
Таким образом получается, что использовать DeepSleep с коротким интервалом, менее 6 минут, не допустимо, при лимите 100000 перезаписей, срок "жизни" ESP8266 всего 1-2 года. Или все-таки частые старты как правило не вызывают перезаписи и не настолько губительны?
 
Сверху Снизу