当代理关闭并出现时,节点JS mqtt客户端没有收到订阅的消息

时间:2016-05-19 02:29:11

标签: javascript node.js mqtt

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

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

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

enter image description here

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

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

以下是我订阅的方式。

this.client.subscribe(topic);

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

2 个答案:

答案 0 :(得分:1)

'false'

fields: obj: json_array 肯定是一个字符串吗?我认为它应该是一个布尔值。

答案 1 :(得分:0)

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

我们订阅了客户端的所有事件,发现offline是代理崩溃时调用的事件。然后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();
            });
    });
}