Я использую библиотеку 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