我对MQTT经纪人有疑问。我的代码在这里,它适用于Mosca服务器。
var mqtt = require('mqtt');
var scanf = require('scanf');
var client = mqtt.connect('mqtt://localhost');
client.on('message', function (topic, message) {
// message is Buffer
console.log(message.toString())
//client.end()
})
client.on('connect', function () {
setInterval(function() {
console.log('Please scan data');
var data = scanf('%s');
console.log('Message Sent');
while(data==0){
client.subscribe('/sensors/#');
break;
}
if(data==1){
client.unsubscribe("/sensors/#");
}
},500);
});
我尝试在输入0之后获取传感器数据,但是我输入了0,他们将所有数据都提供给那个时间。 Arduino ide每500ms继续发送数据,但我只想在输入0时获取数据。
答案 0 :(得分:0)
这有很多问题。
首先scanf('%s')
将阻止,直到按下一个输入,这不是setInterval()
回调中你想要的。
接着你的while循环,它没有按照你的想法做到。
您应该只调用client.subscribe('/sensors/#')
一次,这告诉客户端告知代理,该客户端将被告知与主题“/ sensors /#”匹配的所有消息。之后,MQTT客户端将接收发布的所有消息,直到调用client.unsubscribe('/sensors/#')
。
此外,scanf('%s')
仅在data
永不改变后才会被调用
这意味着循环将永远运行或根本不运行,具体取决于按下的键。
你想要的是这样的:
var mqtt = require('mqtt');
var scanf = require('scanf');
var data = "0";
var client = mqtt.connect('mqtt://localhost');
client.on('message', function (topic, message) {
if (data == "1") {
console.log(message.toString())
}
})
client.on('connect', function () {
client.subscribe('/sensors/#');
});
do {
data = scanf('%s');
} while (true)
这将启动并订阅主题,然后等待您输入1,之后它将打印每条匹配的消息,如果您输入0,它将停止打印输出值,直到您再次输入1。
P.S。良好的MQTT主题设计说主题不应该以前导'/'
开头