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