该项目具有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());
})
发布者
发布者仅添加主题名称,并且在表中分配了该条目的哪个设备并以主题名称发布消息
我想做什么
我想让我的订户重新连接/重新启动以在将新条目分配给订户时获取所有更新的设备?
在当前情况下,当我重新启动订户代码时添加了新主题之后,它可以正常工作,但是我不想每次都重新启动它。
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连接后重新订阅数组中的每个主题。