首页 > 解决方案 > MQTT.js 订阅者在断开重新连接后收到重复消息

问题描述

我正在尝试使用 MQTT.js 创建一个持久会话,并且正如标题所述,除了一件事之外,一切似乎都运行良好。我也在使用 QoS 2,所以客户端应该收到 1 条没有重复的消息

这是代码:

broker.js 应该不重要

发布者.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);
});

订阅者.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。如果我断开连接并重新连接,它会继续这样做。

标签: node.jsmqtt

解决方案


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

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


推荐阅读