Помогите найти, где задержка происходит!
- Войдите на сайт для отправки комментариев
Уважаемые сторожилы! Подскажите, пожалуйста, как избавиться от пятисекундной задержки?
Ситуация: у меня esp8266, коннектится по вайфаю, передает данные по протоколу MQTT. Все успешно. Пока работает сервер MQTT.
Как только сервер отключаешь - ESP8266 начинает тупить. Задержка составляет ровно 5 секунд на 1 проход. Исходя из чего я могу сделать вывод, что оно где-то установлено программно. Но где - найти не могу, облазил библиотеки на предмет delay - там ничего такого нет!
В следующем сообщении прикладываю код скетча и код библиотеки. Если еще что-то нужно - напишите, выложу.
Экспериментировал:
Как только из loop убираешь вот этот if - все работает шустро:
if (client.connect(MQTT::Connect("arduinoClient")
.set_auth("testeruser", "testpass")))
Не то ищете, такое на delay() никогда не делается. Это коннект-таймаут, отрабатывается например в строчке 245 кода в сообщении #3. само значение, судя по всем, задано в файле MQTT.h или где-то еще выше.
Можете попробовать убавить таймаут, например до 2х или даже 1 секунды. Но совсем обнулять таймаут нельзя, иначе у вас и при подключении сервера MQTT перестанет работать.
спасибо, поищу. Меня в принципе не напрягает то, что коннект ждет 5 секунд и отваливается по таймауту.
Меня напрягает, что в эти 5 секунд подвешивается программа.
Я думал где-то delay, и надо его переписать через millis().
А с таймаутами так нельзя,да?
Я думал где-то delay, и надо его переписать через millis().
А с таймаутами так нельзя,да?
похоже вы строчку, которую я указал - даже не смотрели. Она уже через миллис
смотрел, и видел что библиотека вся в целом через миллис написана. Поэтому и удивило: почему цикл loop зависает на 5 секунд, если там через миллис, и вроде как остальная часть программы должна выполняться дальше, если та часть, которая ждет коннекта к МQTT брокеру, входит в режим ожидания...
Посмотрел значение параметра
MQTT_KEEPALIVE, оно равно 15 секунд
Это из MQTT.cpp
для эксперимента поменял MQTT_KEEPALIVE на 1 секунду - не помогло: задержка все равно 5 секунд идет, если нет коннекта. Ищу в том же направлении.
тогда такой вопрос:
что происходит внутри данной строки вызова условия?
if (client.connect(MQTT::Connect("NNN").set_auth(MQTT_USER, MQTT_PASS)))
На сколько я понял,
- Вызывается функция MQTT.connect с параметром имени сервера (NNN).
- далее вызывается функция client.connect с параметром, который возвратила предыдущая функция - точка - set_auth (логин, пароль).
Получается, в итоге в условии будет либо true если законнектились, либо false, если не законнектились.
Вопросы:
1) Что возвращает первая функция MQTT.connect
2) Как проверить, какая из двух используемых тут функций вызывает задержку в 5 секунд?
методом поочередного комментирования кусков кода вычислил, что тупит 207я строка из файла pubsubclient.cpp
Вот эта:
result = _client.connect(server_hostname.c_str(), server_port);
Если кто что толковое подскажет - буду благодарен. Что делает эта строчка? Куда смотреть? Что искать?
Целый день сижу втыкаю (((
Продолжаю поиски проблемы.
Пока решил вопрос отсрочкой на реконнект в 60 секунд в случае неудачного коннекта. Криво, конечно, но по другому не понимаю как.
Кривость в том, что в случае неработающего сервера MQTT выполнение команд все равно будет подвисать 1 раз в минуту на 5 секунд.
Может, кто что порекомендует более адекватное...
А пингануть сервер? Если отвечает то только тогда конектится?
пингануть? в принципе вариант. Где можно посмотреть, какими командами получить результат пинга (успех-неудача)?
https://github.com/dancol90/ESP8266Ping первая ссылка гугля. Забанили?
помню-помню, в среде разработчиков принято общаться саркастически...
PS Благодарю за ссылку.
А пингануть сервер? Если отвечает то только тогда конектится?
Проверил я предложенный Вами вариант. Пинг работает!
НО: он работает точно также, как и приведенный мной код: в момент пинга, то есть вот на этой строке:
выполнение цикла loop на esp8266 подвешивается ровно на те же 5 секунд! Забавно получается ))
В библиотеке пинга есть функция установки таймаута. Правда там как мне показалась минимум секунда. Так что меньше похоже не получится. Но это нормальное поведение в условиях сетевого коннекта. Тут или шашечки или ехать.
да, увидел единичку и неуверенный комментарий, что возможно, это секунды. В то же время в библиотеке стоит 1, а задержка 5 секунд.
На данный момент я остановился на следующем решении:
- если коннект к MQTT серверу произошел, то и так все в порядке в рамках имеющейся библиотеки pubsubclient.
- если коннекта нет, то начинаем отсчет. В течение 10 минут даже не пробуем коннектиться. Выполняем себе код, предназначенный для офлайн режима работы esp8266. Через 10 минут пробуем коннект еще раз.
Таким образом, получается глюк с подвисанием программы всего 5 секунд 1 раз в 10 минут. Это практически идеально.
Всех еще раз благодарю за участие. Тему закрываю.