【问题标题】:How to close connection with mqtt client node.js如何关闭与 mqtt 客户端 node.js 的连接
【发布时间】:2020-06-27 09:40:04
【问题描述】:

我正在做一个如下工作的方法: 当我按下一个按钮时,我想不断地从我订阅的主题中获取消息,当我按下另一个按钮时,我想关闭连接并且不再接收任何消息。我认为连接正确关闭是因为执行了 client.on('close') 事件,但是我继续接收来自该主题的消息。 我应该怎么做才能不再收到任何消息?

startStop 是一个布尔值,当我想接收消息时为 true,当我想停止接收消息时为 false。我做错了什么?

这是我的代码:

mqttClientSubscribeToTraceability(reguladorId, startStop) {
    const tls = (Meteor.settings.mqttConfigClient.mqtt.port === 8883) || Meteor.settings.mqttConfigClient.mqtt.ca;

    const client = mqtt.connect(`${tls ? 'mqtts' : 'mqtt'}://${Meteor.settings.mqttConfigClient.mqtt.host}:${Meteor.settings.mqttConfigClient.mqtt.port}`, 
 { keyPath: Meteor.settings.mqttConfigClient.mqtt.key, 
certPath: Meteor.settings.mqttConfigClient.mqtt.cert, 
ca: [Meteor.settings.mqttConfigClient.mqtt.ca], 
rejectUnauthorized: false 
});

    const topic = `in/1.0/trafficLights/${global.region}/${reguladorId}`;

    const json = {};

    if (startStop) {
      client.on('connect', () => {
        client.subscribe(topic);
      });
      client.on('message', (topic, message) => {
        const msg = JSON.parse(message);
        console.log('msg', msg);
      });   
    } else {
      client.end();
      client.on('close', () => {
        client.unsubscribe(topic);
      });
    }
 }



【问题讨论】:

    标签: node.js meteor mqtt publish-subscribe unsubscribe


    【解决方案1】:

    问题是每次调用函数时都在创建连接对象,而不是保持对它的持久引用。

    这意味着当你调用startstop等于true的函数时,你将创建一个新的客户端对象,订阅主题,然后附加消息回调。然后您丢弃对客户端对象的引用,因此无法取回它。

    当您在startstop 设置为false 的情况下调用该函数时,您仍然会创建一个新的客户端对象,但随后会立即关闭它。 (同样在客户端关闭后调用 unsubscribe 将一无所获,除非可能抛出错误)。

    鉴于您有另一个变量(reguladorId),您可能需要使用一个对象,该对象将其用作保存单独客户端实例的键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-26
      • 2021-12-29
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      相关资源
      最近更新 更多