我正在使用针对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
不,没有办法压制最后的遗嘱(LWT)
但是如果您确定使用的是一致的clientid,我认为它不应该发送它。您说要重置设备,这意味着代理声音等待1.5 *保持活动时间,然后断开客户端连接。只要设备在此之前使用相同的clientid重新连接,或者应该退出旧连接而不触发LWT。
我看不到您在发布的代码中在哪里设置了存活时间或clientid,因此很难说更多。我还将打开代理的日志记录,以检查客户端是否使用相同的clientid连接,并查看它是否正在驱逐先前的客户端。