【问题标题】:MQTT.js multiple subscriptionMQTT.js 多订阅
【发布时间】:2017-11-08 17:14:27
【问题描述】:

我在玩 MQTT 和 MQTT.js。我正在运行一个 MQTT 代理,现在我想订阅多个主题。一个话题没问题,但多个话题。

我有这两个主题:

'sensor/esp8266-1/humidity'
'sensor/esp8266-1/temperature'

我用这段代码订阅了这两个主题

var mqtt = require('mqtt');
var client  = mqtt.connect('mqtt://10.0.0.18');


client.subscribe('sensor/esp8266-1/humidity');
client.subscribe('sensor/esp8266-1/temperature');

client.on('message', function(topic, message, packet) {
    console.log(packet)
});

使用此代码,console.log 会返回以下内容

Packet {
  cmd: 'publish',
  retain: false,
  qos: 0,
  dup: false,
  length: 35,
  topic: 'sensor/esp8266-1/temperature',
  payload: <Buffer 32 31 2e 32 30> }
Packet {
  cmd: 'publish',
  retain: false,
  qos: 0,
  dup: false,
  length: 32,
  topic: 'sensor/esp8266-1/humidity',
  payload: <Buffer 34 31 2e 30 30> }

这看起来第一个很好,但是我怎样才能从中得到温度/湿度数据呢?

我用这个试过了

console.log(packet.payload.toString())

但现在我每次都得到温度和湿度,没有它我知道数字是什么意思。

最后,我想用正确的数据填充两个变量(温度/湿度)。稍后我想连接这两个变量并将它们存储到 SQL 数据库中。

【问题讨论】:

  • “代码不是很实用”是什么意思。该代码订阅了 2 个主题,这正是您要求它做的事情
  • 你也读过文档吗?如何订阅多个主题非常清楚,甚至提供了 3 种不同的方式来做到这一点
  • 是的,但我找不到东西,你在哪里找到的?
  • npmjs.com/package/… 你还没有回答第一个问题
  • 是的,我已经看到了,但是如何读取每个有效负载包?

标签: javascript mqtt iot


【解决方案1】:

您还没有说要如何使用这 2 个值,但以下是最简单的开始方式。

var mqtt = require('mqtt');
var client  = mqtt.connect('mqtt://10.0.0.18');

var temperature;
var humidity;

client.subscribe('sensor/esp8266-1/humidity');
client.subscribe('sensor/esp8266-1/temperature');

client.on('message', function(topic, message, packet) {
  if (topic === 'sensor/esp8266-1/temperature') {
    temperature = message;
  }

  if (topic === 'sensor/esp8266-1/humidity') {
    humidity = message;
  }
});

您可以通过使用单个通配符订阅使其更简单:

client.subscribe('sensor/esp8266-1/+');

它将订阅所有以sensor/esp8266-1/开头的主题

编辑: 现在我们终于解决了你想问的问题(问题中没有明确)

client.on('message', function(topic, message, packet) {
  if (topic === 'sensor/esp8266-1/temperature') {
    temperature = message;
  }

  if (topic === 'sensor/esp8266-1/humidity') {
    humidity = message;
  }

  if (temperature && humidity) {
     //do database update or print
     console.log("----");
     console.log("temp: %s", temperature);
     console.log("----");
     console.log("humidity: %s", humidity);
     //reset to undefined for next time
     temperature = undefined;
     humidity = undefined;
  }
});

【讨论】:

  • 这些让我可以使用相同的数据注销!
  • 是的,每条消息都是一个单独的事件,没有办法一次获取所有数据。这不是 MQTT 的工作方式
  • 好的,问题就出在这里,现在我将在 Rest API 方式上执行此操作...
  • 您可以从您的设备在一条消息中发送这两个值
  • 或者您可以在on('message') 回调中进行测试,看看您是否拥有这两个值,然后更新数据库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 2017-03-02
相关资源
最近更新 更多