簡體   English   中英

mqtt經紀人+節點js + dht11傳感器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM