【问题标题】:Node JS mqtt client doesn't received subscribed messages when broker goes down and comes up当代理关闭并出现时,Node JS mqtt客户端未收到订阅消息
【发布时间】:2016-05-19 02:29:11
【问题描述】:

我已经创建了一个 mqtt 节点 js 客户端。我的连接选项如下。

mqttOptions = {
clientId: '100',
keepAlive: 1000,
clean: false,
reconnectPeriod: '1000',
will: willMessage
};

当客户端仍在运行时,我断开了服务器并再次启动它。客户端具有每 1 秒发布一次的逻辑。尽管客户端在此重新连接后正在发布,但它没有收到消息。它订阅了自己的消息主题。既然我将 clean 选项设置为 false,它是否应该在重新连接时不订阅主题并开始接收它们?

以下是我建立连接的方式。

this.client = mqtt.connect(url, mqttOptions);

以下是我的订阅方式。

this.client.subscribe(topic);

我在这里做错了什么?请指教。

【问题讨论】:

    标签: javascript node.js mqtt


    【解决方案1】:

    我们在使用 EMQ 作为代理和使用用于 NodeJS 的 mqtt 库时遇到了这个问题。当 mosquitto 作为代理时,客户端重新连接并获取它已订阅的所有消息。但是,如果它再次订阅,它会获得n 相同消息的副本数。根据图书馆文档,建议检查connackconnack.sessionPresent 以获取以前的订阅。

    我们订阅了客户端的所有事件,发现offline是broker宕机时调用的那个。然后调用reconnectclose 直到代理启动。因此,这就是我们的做法。在offlineend 上强制客户端并在结束时创建一个新客户端 - 与用于创建客户端的函数相同:

    doConnect() {
        this.client = mqtt.connect('mqtt://myhost', this.myOptionsIfAny);
        this.client.on('connect', () => {
            this.client.subscribe('mytopics');
            this.client.on('message', (topic, message) => {
                // do processing
            });
            this.client.on('offline', () => {
                this.client.end(true, () => {
                    doConnect();
                });
        });
    }
    

    【讨论】:

      【解决方案2】:
      clean: 'false',
      

      'false' 一定是字符串吗?我想它应该是一个布尔值。

      【讨论】:

      • 我的想法完全正确。
      • 抱歉打错了。但它仍然没有解决它。将其更改为布尔值但结果相同:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多