我有一个关于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时获取数据。
发布于 2018-01-21 21:46:27
这样做有很多问题。
首先,scanf('%s')会一直阻塞,直到按下enter键,这不是您在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)这将启动并订阅topic,然后它将等待您输入1,之后它将打印所有匹配的消息,如果您随后输入0,它将停止打印值,直到您再次输入1。
附注:好的MQTT主题设计表明主题不应该以'/‘开头
https://stackoverflow.com/questions/48366839
复制相似问题