Как подавить сообщение MQTT Last Will при повторном подключении клиента? - PullRequest
0 голосов
/ 09 октября 2019

Я использую библиотеку EspMQTTClient для Arduino и ESP8266;но мой вопрос вполне может быть применим к любой среде.

Клиент устанавливает сообщение Last Will для широковещательной передачи в случае, если клиент отбрасывает. Однако, если клиент отбрасывает, а затем немедленно повторно подключается, я хочу подавить сообщение.

Поскольку уникальный идентификатор клиента такой же, я бы подумал, что это будет стандартное поведение;но, видимо, нет.

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

Как я могу подавить сообщения Last Will для клиентов, которые успешно подключились до истечения времени ожидания?

РЕДАКТИРОВАТЬ:Вот некоторый упрощенный код, демонстрирующий проблему:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <EspMQTTClient.h>
#include "lwip/inet.h"
#include "lwip/dns.h"
#include "mqtt.h"
#include "secret.h"

#define SERVICE_NAME    "pc-control"

EspMQTTClient mqtt(SSID, PASSWORD, MQTT_SERVER, (String(SERVICE_NAME) + "/Example").c_str());;

void onConnectionEstablished() {
    mqtt.publish("Example", "ready");
}

void setup() {
    mqtt.enableLastWillMessage("Example", "dead", true);
}

void loop() {
    mqtt.loop();
    delay(100);
}

Проблема, похоже, связана с битом String(SERVICE_NAME) + "/Example". Я подумал, что, возможно, это создает висячий указатель;но если бы это было причиной, я бы ожидал, что LWT произойдет даже до того, как клиент потерял соединение.

У меня запущен «брокер сообщений mosquitto MQTT v3.1», и подписчик выглядит так:

mosquitto_sub -t "#" -v
Example ready
<<<I reset the client here>>>
Example ready
Example dead

Ответы [ 3 ]

0 голосов
/ 10 октября 2019

Если ваш брокер, следуя спецификации MQTT v3.1.1, обнаружит, что вы отключились, то совершенно правильно опубликовать LWT. Нет способа остановить это.

@ hardillb предполагает, что если соединение разорвалось, но не было замечено брокером, то вам нужно сохранить активность * 1.5, чтобы восстановить соединение перед отправкой LWT. Это верно. Однако, и это очень важно, вы полагаетесь на то, что потеря соединения не была распознана у брокера. Иногда это может работать, но это не то условие, на которое я бы хотел положиться.

Если эта функция очень важна для вас, тогда вам, вероятно, стоит подумать об использовании MQTT v5. Это даст вам возможность установить «интервал истечения сеанса», то есть время, в течение которого ваш сеанс будет активным после отключения перед отправкой LWT.

0 голосов
/ 10 октября 2019

В вашем конкретном случае попробуйте перейти на Mosquitto 1.6.3 или новее. Существует ошибка с захватом сеанса, затрагивающая от 1,5 до 1.6.2.

0 голосов
/ 10 октября 2019

Нет, нет способа подавить Последнюю Волю и Завет (LWT)

Но если вы уверены, что используете постоянную клиентуру, я не думаю, что она должна отправлять ее. Вы сказали, что перезагружаете устройство, что означает, что звук посредника будет ждать 1,5 * времени поддержки, а затем отключать клиент. Пока устройства повторно подключаются к одному и тому же клиенту до того, как это произойдет, или должны удалить старое соединение, не запуская LWT.

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

...