[英]mqtt broker + node js + dht11 sensor
我對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每500毫秒繼續發送數據,但是我只想在輸入0時獲取數據。
這有很多問題。
首先, scanf('%s')
將阻塞,直到按下setInterval()
回調中不想要的Enter為止。
接下來的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。
ps好的MQTT主題設計表明主題不應以前導“ /”開頭
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.