Как закрыть соединение с клиентом mqtt node.js - PullRequest
0 голосов
/ 16 марта 2020

Я делаю метод, который работает следующим образом: Когда я нажимаю кнопку, я хочу получать сообщения от topi c, на которые у меня есть подписка, и когда я нажимаю другую кнопку, я хочу закрыть соединение и не получать больше сообщений. Я думаю, что соединение закрывается правильно, потому что выполняется событие client.on ('close'), однако я продолжаю получать сообщения от topi c. Что я должен сделать, чтобы больше не получать сообщения?

startStop - логическое значение, это правда, когда я хочу получать сообщения, и 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);
      });
    }
 }



1 Ответ

0 голосов
/ 16 марта 2020

Проблема в том, что вы создаете объект подключения каждый раз, когда вызываете функцию, и не сохраняете постоянную ссылку на нее.

Это означает, что когда вы вызываете функцию с startstop, равным true, вы создаст новый клиентский объект, подпишется на topi c и затем прикрепит сообщение обратным вызовом. Затем вы выбрасываете ссылку на клиентский объект, чтобы не было возможности ее вернуть.

Когда вы вызываете функцию с startstop, установленным в false, вы все равно создаете новый клиентский объект, но затем сразу закрой его. (Также вызов отказа от подписки после закрытия клиента ничего не даст, кроме, возможно, выдачи ошибки).

Учитывая, что у вас есть другая переменная (reguladorId), вам, вероятно, нужно использовать объект, который использует ее в качестве ключа хранить отдельные клиентские экземпляры.

...