NodeMCU сбрасывается с помощью mqtt.client: close ()) или mqtt.client: connect () - PullRequest
0 голосов
/ 28 марта 2019

У меня есть приложение, которое использует mqtt для связи между модулями и мобильным терминалом.

В некоторых ситуациях, когда сообщения не поступают, узел выполняет самотестирование MQTT (отправка сообщения самому себе), а при сбое самотестирования пытается повторно подключиться к брокеру (mqtt не всегда приходит в автономном режиме). И тогда могут возникнуть две проблемы: Если я выполняю mqtt.client: close (), чтобы убедиться, что клиент закрыт (чтобы избежать второй проблемы), а клиент уже закрыт, узел сбрасывается. Если я выполняю mqtt.client: connect () и клиент все еще подключен, возникает исключение и рестет.

есть ли способ узнать, подключен ли клиент mqtt или нет?

Спасибо за ваш комментарий. Я собираюсь описать, что я делаю, чтобы увидеть, можете ли вы мне помочь: У меня две независимые системы: хозяин и раб. Мастер публикует тестовое сообщение каждые 10 минут. Если нет ответа от раба. он публикует тестовое сообщение для себя. Если самопроверка не наступает, предполагается отключение от брокера и инициируется повторное соединение.

И здесь возникает проблема: иногда клиент отключается, и все идет хорошо, но иногда он все еще подключен, но не отвечает, и узел перезагружается с исключением «уже подключено».

Выполнение mqtt: close () перед повторным подключением должно быть безопасным, но если я отправлю его, и клиент действительно отключится, узел будет перезагружен без какой-либо причины (известной мне).

Все это происходит без получения сообщений в автономном режиме.

1 Ответ

0 голосов
/ 28 марта 2019

Вместо того, чтобы ждать сообщений, отправленных вручную главным клиентом (которые могут быть не в состоянии отправляться по разным причинам, что приводит к неверному выводу прослушивающего устройства о состоянии его соединения с брокером), я рекомендую использовать встроенный в MQTTуправление соединениями.

  • Во-первых, вы можете убедиться, что исходное соединение каждого клиента прошло успешно, включив обработчик ошибок в :connect().Если клиент действительно открывается, ничто в документации NodeMCU не указывает, что он закроется сам;он может идти offline.
  • После подключения клиент знает, что что-то не так, когда отправляет сообщение и не получает ответ.Похоже, вы не слишком много звоните :publish() (что в противном случае сообщило бы вам, вернув false), поэтому пинг может быть лучшим.Если вы ожидаете получать сообщения от брокера каждые n секунд, установите время активности активности немного выше, чем на клиенте.
  • Тогда, если ответ на эти сообщения не получен, вызовет событие что вы можете ответить.Это может быть что-то вроде следующего (не проверено, может лучше работать вне вызова): m:on("offline", function(client) m:close() end)
...