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