MQTT.js 订阅者在 disconnect-reconnect 后收到重复消息

MQTT.js subscriber receives duplicates message after disconnect-reconnect

我正在尝试用 MQTT.js 创建一个持久的 session,除了一件事,一切似乎都很好,正如标题所说。 我也在使用 QoS 2,因此客户端应该收到 1 条没有重复的消息

代码如下:

broker.js 应该没关系

publisher.js

const mqtt = require("mqtt");

const getWeather = require("./api-clients/openWeatherMap/openWeatherMapClient");

const client = mqtt.connect("mqtt://localhost", {
  port: 1883,
  clean: false,
  clientId: "mqttjs_" + Math.random().toString(16).substr(2, 8),
});

client.on("connect", () => {
  console.log("connected");
  let i = 0;
  setInterval(() => {
    var weatherPromise = Promise.resolve(getWeather("Milan"));

    weatherPromise.then((data) => {
      var object = JSON.parse(data).coord;
      client.publish("Weather", i + " " + JSON.stringify(object), {
        qos: 2,
      });
      i++;
    });
  }, 5000);
});

subscriber.js

const mqtt = require("mqtt");

const client = mqtt.connect("mqtt://localhost", {
  port: 1883,
  clean: false,
  clientId: "mqttjs_1",
});

client.on("connect", () => {
  client.subscribe("Weather", { qos: 2 });
});

client.on("message", (message) => {
  context = message.toString();
  console.log(context);
});

这是客户端订阅者收到的内容:

subscriber.js 断开连接一段时间然后重新连接并如预期收到:

然后,断开并重新连接后,它收到:

我真的不知道为什么它又收到消息 3。 如果我断开连接并重新连接,它会一直这样做。

我测试了这个问题,并没有收到重复的消息,但似乎在 MQTT.js 的早期版本中存在问题,但我发现它已修复。也许你可以先用 MQTT 客户端进行预测试,不确定它是否是你的 MQTT Broker,推荐使用 MQTT X: http://mqttx.app/ 来验证你的 MQTT Broker。如果是同一个问题,那可能不是你写的客户端的代码问题。

以防万一,如果您想查看 MQTT.js 教程:https://www.emqx.com/en/blog/mqtt-js-tutorial