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

Вопрос потеря связи при потере интернета.

horreodor

New member
Добрый день.
хочу узнать ваше мнение.
использую библиотеку ESP8266WiFi.h для работы в среде arduino
при подключение к интернету через роутер все работает нормально, но если на пару минут отключить интернет от роутера, то nodemcu теряет связь с миром. =(
с роутером связь возобновляется, но вот с внешним миром теряет связь
пробовал перезагружать nodemcu, пробовал переконнект, но связи нет, помогает только смена mac адреса у nodemcu, и соотвественно новый ip
может есть какой более простой способ, а то мак новй каждый рендомить печалька =(
 

enjoynering

Well-known member
а вот так пробовали?

Код:
  if (WiFi.getAutoConnect() != true)  //will be effective the next power-on, if saved into SDK flash area
  {
    WiFi.persistent(true);            //enable saving wifi config into SDK flash area
    WiFi.setAutoConnect(true);        //on power-on automatically connects to last used hwAP
    WiFi.persistent(false);           //disable saving wifi config into SDK flash area
  }
  WiFi.setAutoReconnect(true);        //automatically reconnects to hwAP in case it's disconnected
 

horreodor

New member
это у меня по дефолту установлено =(
к точке доступа то он подключается нормально, но вот в глобальную паутину уже не выходит почему то.
все работает нормально, допустим перезагружаю роутер с usb модемом, роутер включается, nodemcu успешно к нему подключается, но интернета на роутере еще нет, и тут получается что после того как модем заработает, доступа у nodemcu так и не появится почему то к интернету. и ничего не решает проблему кроме как смена mac, так как роутер тогда выдаст новый ip nodemcu, так как подумает что это новое устройство.
еще как мысль делать задержку к передподключению, но тогда нужно отказаться от WiFi.setAutoReconnect(true);
 

CodeNameHawk

Moderator
Команда форума
А после реконекта, вы перезапускаете сервера?
Логика работы такая :
проверка if (WiFi.status() != WL_CONNECTED)
и если нет соединения, по новой WiFi.begin , а после того, как соединение востановилось,
делаем снова MDNS.begin , server.begin и другие, которые используете.
 

horreodor

New member
if(c>0) WiFi.disconnect();
while(WiFi.status() != WL_CONNECTED)
{
cc++;
WiFi.begin(namehost1.c_str(), passhost1.c_str());
for(int x=0; x<20; x++)
{
delay(500);
Serial.print(".");
if(WiFi.status() == WL_CONNECTED)break;
}

if(WiFi.status() == WL_CONNECTED)break;
...
как то так делаю. фрагмент кода.
 

CodeNameHawk

Moderator
Команда форума
Это часть подключения к роутеру, а где та, что лезет в интернет.
 

horreodor

New member
Это часть подключения к роутеру, а где та, что лезет в интернет.
WiFiClient client;
if (client.connect(host, 80))
{
......
client.print(cmd + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n" +
"\r\n"
);
String str = "";
while (client.connected())
{
if (client.available())
{
str+= client.readStringUntil('\n');
}
}
Serial.println(str);
client.stop();
......

else
{
Serial.print("CONNECT TO SERVER ERROR ");
client.stop();
// подключиться к хосту не удалось
}
 

horreodor

New member
если работать через библиотеку <ESP8266WiFiMulti.h> как в примере BasicHTTPClient то такого косяка не наблюдается... странно, где то, что то, я не так делаю или не доделываю...
в принципе мне не принципиально, можно и чуток переделать под эту библиотеку =) спасибо за наводку!
 

CodeNameHawk

Moderator
Команда форума
Мне не нравиться while (client.connected()), если не пропадет connect будет подвисон, может лучше через millis.
 

horreodor

New member
согласен, лучше так. но к сожалению на общую картину это не повлияет.
String str = "";
int ct = millis() + (1000*20);
while (client.connected())
{
if ( millis()>ct )
break;
if (client.available())
str+= client.readStringUntil('\n');
}
delay(200);
client.stop();
 

horreodor

New member
нет, а почему должен ругаться?
сейчас специально затестил
int sec = 20;
Serial.println("MILLIS TEST: "+ String(millis()) + "-" + String(millis()+(1000*sec)) +".");

и

Serial.println("MILLIS TEST: "+ String(millis()) + "-" + String(ct) +".");

все компиллится и работает.
 

CodeNameHawk

Moderator
Команда форума
Тестировать надо int ct = millis() + (1000*20);
Вы, в переменную типа int запихиваете тип long.
Даже int ct = 1000*20; должен выдавать неправильный результат.(Если в есп тип int == int8_t)

int sec = 20;
Serial.println("MILLIS TEST: "+ String(millis()) + "-" + String(millis()+(1000*sec)) +".");
это как раз правильно, компилятор сам подобрал нужные типы.
 
Последнее редактирование:

horreodor

New member
я и так тестировал
int ct = millis() + (1000*20);
Serial.println("MILLIS TEST: "+ String(millis()) + "-" + String(ct) +".");
и как не странно работает О_о хотя действительно там должен быть long
 

CodeNameHawk

Moderator
Команда форума
(Если в есп тип int == int8_t)
(Имел ввиду int16_t, как в AVR)

В есп тип int == int32_t и long такой же, так что к компилятору нет претензий.
Код:
    ct = INT32_MAX;
    Serial.println(ct);

    ct = __LONG_MAX__;
    Serial.println(ct);
Дает одинаковый результат
2147483647
2147483647
 
Последнее редактирование:
Сверху Снизу