node.js - 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);
});
这是客户端订阅者收到的内容:
0 {"lon":12.2214,"lat":46.145}
1 {"lon":12.2214,"lat":46.145}
subscriber.js 断开连接一段时间,然后重新连接并按预期接收:
- 2 {"lon":12.2214,"lat":46.145}
- 3 {"lon":12.2214,"lat":46.145}
- 4 {"lon":12.2214,"lat":46.145}
- 5 {"lon":12.2214,"lat":46.145}
然后,在断开连接并再次重新连接后,它会收到:
- 3 {"lon":12.2214,"lat":46.145}
- 6 {"lon":12.2214,"lat":46.145}
- 7 {"lon":12.2214,"lat":46.145}
而且我真的不知道为什么它会再次收到消息 3。如果我断开连接并重新连接,它会继续这样做。
解决方案
我测试了这个问题,并没有收到重复的消息,但是在之前的 MQTT.js 版本中似乎存在问题,但我发现它已修复。也许你可以先用 MQTT 客户端进行预测试,不确定它是否是你的 MQTT Broker,推荐使用 MQTT X:http://mqttx.app/来验证你的 MQTT Broker。如果是同样的问题,那可能不是您编写的客户端的代码问题。
以防万一您想查看 MQTT.js 教程:https ://www.emqx.com/en/blog/mqtt-js-tutorial
推荐阅读
- python - 为什么 a=[0] 的 list(x for x in a) 比 a=[] 快?
- function - haskell 风格的广义函数组合
- google-photos-api - 如何使用共享 URL 获取 Google 照片的 mediaItemId?
- php - php firebase推送通知ios:错误无效注册
- php - 在 mac osX 上升级到 php 7.4
- c++ - 使用 iptables 共享来自两个不同连接的 Internet 连接
- java - 在Spring配置中模拟命名bean而不使用allow-bean-definition-overriding?
- jquery - 如何避免在悬停时重新缩放?
- android - Dagger Hilt - 如何将 ViewModel 注入适配器?
- apache-kafka - 暂停和恢复 KafkaConsumer