• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 и мне интересно как народ решает эту проблему.
 
Сверху Снизу