【问题标题】:Losing MQTT messages when using MQTT.js and Mosquitto使用 MQTT.js 和 Mosquitto 时丢失 MQTT 消息
【发布时间】:2019-10-29 16:01:18
【问题描述】:

由于不断断开/重新连接,我的 MQTT.js 客户端无法接收来自 Mosquitto 代理的所有消息。当添加选项clean: false 发布和订阅时,客户端完全停止接收消息。我已经尝试了qos 的所有设置,但没有成功。我想我使用 cleanSession 不正确,有人知道吗?

我的配置如下:

var options = {
    clientId: "python_pub",
    clean: false,
    qos: 2  
};

// connect to the message server
var client = mqtt.connect('mqtt://PATH_TO_BROKER', options);

client.on('connect', function() {   
  client.subscribe('topic_name');
})

client.on('message', function(topic, message) {
  console.log("received: %s", message);
}

var count = 0;
while (count < 100) {
  client.publish('test_topic', count.toString(), {qos: 2});
  count++;
}

【问题讨论】:

    标签: mqtt mosquitto


    【解决方案1】:

    QOS 不仅仅是发布消息的设置,它也是订阅的一部分。

    QOS 一次仅涵盖消息传输的一个分支。例如仅在发布者和代理之间,而不是一直到客户端。如果您希望向客户保证交付,您还需要以大于 0 的 QOS 进行订阅。

    options 对象中的 qos 选项将被忽略。

    您还应该先看看为什么您的客户总是断开连接。我看到您有一个硬编码的客户端 ID,这通常不是一个好主意,因为客户端 ID 需要在连接到代理的所有客户端中是全局唯一的。如果第二个客户端尝试使用已连接客户端的 clientid 连接到代理,它将踢掉第一个客户端。如果您启用了自动重新连接,那么这只会导致两个客户端争吵并将对方踢出代理,这听起来像您描述的问题。

    【讨论】: