如果客户端重新连接,如何抑制MQTT Last Will消息?

问题描述 投票:0回答:1

我正在使用针对Arduino和ESP8266的EspMQTTClient库;但我的问题很可能适用于任何环境。

如果客户端掉线,客户端会设置“最后遗嘱”消息进行广播。但是,如果客户端掉线然后立即重新连接,我想隐藏该消息。

由于客户端的唯一ID是相同的,所以我认为这将是标准行为;但显然不是。

因此,客户端掉线并重新连接。我收到客户端发送的启动消息,并且then我收到“客户端已死”的最后遗嘱消息。这无济于事,因为客户端似乎已再次死亡并且无法重新连接。

我该如何为在超时之前成功重新连接的客户端取消最后发出的消息?

编辑:这是一些演示问题的简化代码:

#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
arduino mqtt esp8266 mosquitto
1个回答
0
投票

不,没有办法压制最后的遗嘱(LWT)

但是如果您确定使用的是一致的clientid,我认为它不应该发送它。您说要重置设备,这意味着代理声音等待1.5 *保持活动时间,然后断开客户端连接。只要设备在此之前使用相同的clientid重新连接,或者应该退出旧连接而不触发LWT。

我看不到您在发布的代码中在哪里设置了存活时间或clientid,因此很难说更多。我还将打开代理的日志记录,以检查客户端是否使用相同的clientid连接,并查看它是否正在驱逐先前的客户端。

© www.soinside.com 2019 - 2024. All rights reserved.