如何在节点JS中重新启动MQTT订户

时间:2019-12-04 09:51:04

标签: mysql node.js mqtt

项目与Node Js和MQTT一起使用

设备最初订阅了一个主题或主题列表,并开始从仪表板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());
})

发布者

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

我想做什么

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

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

1 个答案:

答案 0 :(得分:1)

在将新主题推送到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连接后重新订阅数组中的每个主题。

相关问题