如何在节点js中重启mqtt订阅者

问题描述 投票:0回答:1

该项目具有Node Js和MQTT

设备最初已经订阅了一个主题或主题列表,并开始从仪表板admin检索针对这些主题发布的消息,为该设备分配了另一个新主题,该设备(订户)上正在运行客户端代码admin没有访问以重新启动它,设备将如何动态更新为新分配的主题?我们是否需要重新启动设备以获取分配的主题的更新列表?

//subscriber.js

var mqtt = require('mqtt')
var client  = mqtt.connect('mqtt://test.mosquitto.org')
const mysql = require('mysql');

const subName = 'iPhoneX';

var subscribed = [];
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '',
  database: 'mydb'
});
connection.connect((err) => {
  if (err) throw err;
  console.log('Connected!');
});
var qry = `SELECT topic_name from sub_table s where s.sub_name='${subName}'`;

connection.query(qry, (err,rows) => {
  if(err) throw err;  
  rows.forEach( (row) => {      
      console.log(row.topic_name);
      subscribed.push(row.topic_name);
    });
  });

client.on('connect', function () {
  subscribed.forEach(element => {
    client.subscribe(element);
  });  
})

client.on('message', function (topic, message) {
  console.log(topic, '------>', message.toString());
})

发布者

发布者仅添加主题名称,并且在表中分配了该条目的哪个设备并以主题名称发布消息

我想做什么

我想让我的订户重新连接/重新启动以在将新条目分配给订户时获取所有更新的设备?

在当前情况下,当我重新启动订户代码时添加了新主题之后,它可以正常工作,但是我不想每次都重新启动它。

mysql node.js mqtt
1个回答
0
投票
将新主题推送到subscribed数组后,您可以关闭并重新连接mqtt连接/订户。

connection.query(qry, (err,rows) => { if(err) throw err rows.forEach( (row) => { console.log(row.topic_name) subscribed.push(row.topic_name) }) if (rows.length > 0) { client.end() client = mqtt.connect('mqtt://test.mosquitto.org') } })

您的client.on('connect', function ()将完成剩下的工作,并在再次建立mqtt连接后重新订阅数组中的每个主题。
© www.soinside.com 2019 - 2024. All rights reserved.