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);
});
这是客户端订阅者收到的内容:
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
我正在尝试用 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);
});
这是客户端订阅者收到的内容:
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