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

Нужна помощь Можно ли сейчас использовать WiFi.begin(ssid, password)

selan61

Member
Прочитал на форуме что, @enjoynering пишет:"каждый раз когда вызываете WiFi.begin(ssid, password); ардуино перезаписывает название точки доступа и пароль. в итоге через год, два таких манипуляций у вас на флешке будет дырка."
Нашел и сохранил все сообщения по этому поводу, но окончательно запутался.
Так и не понял можно ли сейчас использовать WiFi.begin(ssid, password); или нет. Вроде @enjoynering потом писал, что, цитата"Теперь перед сохранием пароля и ssid проверяют его с сохраненным на флешке и не перезаписывают зря. ну и для самых продвинутых внедрили запрет на запись путем вызова функции WiFi.persistent(false). "
И что лучше использовать для отключения WIFI WiFi.disconnect(false); или WiFi.mode(WIFI_OFF); чтобы контроллер крутился и выполнял какие либо действия и иногда включал WIFI для передачи данных.
Поэтому в скетч сделал вставки на основе рекомендаций @enjoynering. Только не знаю, правильно или нет.
/*
* This example show how to ping a remote machine using it's hostname
*/
#include <ESP8266WiFi.h>
#include <ESP8266Ping.h>
#include <SimpleTimer.h>
const char* ssid = "ssid";
const char* password = "password";
const char* host = "narodmon.ru";
SimpleTimer timer;
void setup() {
Serial.begin(115200);
timer.setTimeout (15000, connectwifi);// через 15 сек однократно выполнить функцию connectwifi
timer.setInterval (600000, pinghost);// каждые 10 мин выполняем функцию pinghost
}
void loop(){
timer.run();
}
void connectwifi(){ // функция первоначального подключения к WIFI
Serial.println("Connecting to WiFi");

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.print("WiFi connected with ip ");
Serial.println(WiFi.localIP());
if (WiFi.getPersistent() == true) WiFi.persistent(false);
//disable saving wifi config into SDK flash area
WiFi.mode(WIFI_OFF); // отключаем WIFI
WiFi.persistent(true); //enable saving wifi config into SDK flash area
}
void pinghost(){ // функция пинга host
Serial.println("Connecting to WiFi");

if (WiFi.getAutoConnect() != true) //configuration will
be saved into SDK flash area
{
WiFi.setAutoConnect(true); //on power-on automatically
connects to last used hwAP
WiFi.setAutoReconnect(true); //automatically reconnects to hwAP in case it's disconnected
}
Serial.print("WiFi connected with ip ");
Serial.println(WiFi.localIP());
Serial.print("Pinging host ");
Serial.println(host);
if(Ping.ping(host)) {
Serial.println("Success!!");
}
else {
Serial.println("Error :(");
}
//WiFi.disconnect();
if (WiFi.getPersistent() == true) WiFi.persistent(false);
//disable saving wifi config into SDK flash area
WiFi.mode(WIFI_OFF); // отключаем WIFI
WiFi.persistent(true); //enable saving wifi config into SDK flash area

}
 

selan61

Member
Если не будете использовать, то как к сети подключитесь?
Значит я не точно выразился. Первый раз мы используем WiFi.begin(ssid, password); подключились, отправили данные, отключились, WiFi.disconnect(false);
А как правильно подключаться при регулярной отправке данных через определенные промежутки времени, что бы не переписывать название точки доступа и пароль на флешке.
каждый раз когда вызываете WiFi.begin(ssid, password); ардуино презаписывает назание точки доступа и пароль. в итоге через год, два таких манипуляций у вас на флешке будет дырка.

надо делать так

Код:
  if (WiFi.SSID() != stationConfig.ssid || WiFi.psk() != stationConfig.password)                    //don't rewrite flash with no reason
  {
    WiFi.begin(stationConfig.ssid, stationConfig.password);
  }
 else
{
  WiFi.begin();
}
Эта же проблема описана на
ESP8266:Прошивки/Arduino/Библиотеки/Библиотека ESP8266WiFi/Класс Generic — Онлайн справочник
потом от @enjoynering поступила информация:
Надо отдать должное, они вняли вашей критике и теперь перед сохранием пароля и ssid проверяют его с сохраненным на флешке и не перезаписывают зря. ну и для самых продвинутых внедрили запрет на запись путем вызова функции WiFi.persistent(false). вот пример WiFi.begin(ssid, password) для запуска клиента:
полный код находится по адресу - Arduino/ESP8266WiFiSTA.cpp at master · esp8266/Arduino · GitHub
чтоб до конца понять, надо еще заглядывать сюда - Arduino/ESP8266WiFiGeneric.cpp at master · esp8266/Arduino · GitHub
Так можно использовать при повторном подключении функцию WiFi.begin(ssid, password); и она уже не перезаписывает название точки доступа и пароль на флешке или все же чтобы не испортить флешку надо использовать другие способы?
На github Ivan Grokhotkov WiFi config corrupted after multiple restarts · Issue #1054 · esp8266/Arduino вроде пишет про попытки устранения проблемы, но непонятно, устранена она или нет.
Если в ядре ESP8266 устранили проблему, надо ли его перезаписывать или как то обновить?
 

selan61

Member
Чесно говоря, я не понимаю почему подобной проблемой никто не озадачился раньше. Наверное у всех есть устройства на ESP которые спят, раз в полчаса или раньше просыпаются, подключаются к роутеру, отправляют данные, отключаются и снова засыпают. И каждый раз при подключении на флешке перезаписывается название точки доступа и пароль. А через пару, тройку лет от постоянной перезаписи флешка сдыхает и еспишка перестает работать. На гитхабе WiFi config corrupted after multiple restarts · Issue #1054 · esp8266/Arduino еще в 2015 году озадачились этой проблемой, а тут я не встречал подобных сообщений. Я об этом случайно узнал из сообщения@enjoynering и мне интересно как народ решает эту проблему.
 
Сверху Снизу