如何关闭与 mqtt 客户端的连接 node.js
How to close connection with mqtt client node.js
我正在做的方法如下:
当我按下一个按钮时,我想不断地从我订阅的主题中获取消息,而当我按下另一个按钮时,我想关闭连接并且不再接收任何消息。我认为连接正确关闭是因为执行了 client.on('close') 事件,但是我继续从该主题接收消息。
我应该怎么做才能不再收到消息?
startStop
是一个布尔值,当我想接收消息时为真,当我想停止接收消息时为假。我做错了什么?
这是我的代码:
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);
});
}
}
问题是您每次调用该函数时都在创建连接对象,而不是保持对它的持久引用。
这意味着当你调用startstop
等于true的函数时,你将创建一个新的客户端对象,订阅主题,然后附加消息回调。然后您丢弃对客户端对象的引用,因此无法取回它。
当您调用 startstop
设置为 false 的函数时,您仍然会创建一个新的客户端对象,但随后会立即将其关闭。 (在客户端关闭后调用取消订阅除了可能抛出错误外什么也做不了)。
鉴于您有另一个变量(reguladorId
),您可能需要使用一个对象,该对象将其用作保存单独客户端实例的键。
我正在做的方法如下: 当我按下一个按钮时,我想不断地从我订阅的主题中获取消息,而当我按下另一个按钮时,我想关闭连接并且不再接收任何消息。我认为连接正确关闭是因为执行了 client.on('close') 事件,但是我继续从该主题接收消息。 我应该怎么做才能不再收到消息?
startStop
是一个布尔值,当我想接收消息时为真,当我想停止接收消息时为假。我做错了什么?
这是我的代码:
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);
});
}
}
问题是您每次调用该函数时都在创建连接对象,而不是保持对它的持久引用。
这意味着当你调用startstop
等于true的函数时,你将创建一个新的客户端对象,订阅主题,然后附加消息回调。然后您丢弃对客户端对象的引用,因此无法取回它。
当您调用 startstop
设置为 false 的函数时,您仍然会创建一个新的客户端对象,但随后会立即将其关闭。 (在客户端关闭后调用取消订阅除了可能抛出错误外什么也做不了)。
鉴于您有另一个变量(reguladorId
),您可能需要使用一个对象,该对象将其用作保存单独客户端实例的键。