通过MQTT在节点应用之间进行简单的通信

时间:2016-11-25 11:03:16

标签: node.js mqtt

您好我是MQTT的新手,我在最后几天阅读了很多关于它的帖子和博客,但我似乎并不完全理解所需的不同部分,例如Br​​oker,Clients。

我希望两个节点应用程序通过本地mqtt服务相互通信。据我所知,这个mqtt服务叫做broker。我管理它让2节点应用程序通过这样的公共代理进行通信:

app1(发件人)

 const mqtt = require('mqtt');

 // to be changed to own local server/service
 const client = mqtt.connect('http://broker.hivemq.com');

 client.on('connect', () => {
     let id = 0;
     setInterval(() => {
         client.publish('myTopic', 'my message - ' + ++id);
     }, 3000);
 });

app2(接收方)

const mqtt = require('mqtt');

// to be changed to own local server/service
const client = mqtt.connect('http://broker.hivemq.com');

client.on('connect', () => {
    client.subscribe('myTopic');
});

client.on('message', (topic, message) => {
    console.log('MSG: %s: %s', topic, message);
});

由于这有效,我希望继续将公共经纪人替换为私有。过了一会儿,我发现 mqtt-server 作为节点包。

所以我尝试了以下作为第三个节点应用,它应该是 app1 app2 的代理:

服务器(MQTT代理)

fs = require('fs');
mqttServer = require('mqtt-server');
let subscriptions = [];

let servers = mqttServer(
  // servers to start
  {
    mqtt: 'tcp://127.0.0.1:1883',
    mqttws: 'ws://127.0.0.1:1884',
  },
  // options
  {
    emitEvents: true
  },
  // client handler
  function (client) {
    client.connack({
      returnCode: 0
});

client.on('publish', (msg) => {
  let topic = msg.topic;
  let content = msg.payload.toString();
    // this works, it outputs the topic and the message.
    // problem is: app2 does not receive them.
    // do we have to forward them somehow here?
    console.log(topic, content);

    });

    client.on('subscribe', (sub) => {
      let newSubscription = sub.subscriptions[0];
      subscriptions.push(newSubscription);
      console.log('New subscriber to topic:', newSubscription.topic);
    });
  });

servers.listen(function () {
  console.log('MQTT servers now listening.');
});

问题

app1 app2 中调整连接-Uris(均为ws://127.0.0.1:1884)后,服务器应用会收到所有已发布的消息识别某人已关联并收听特定主题

但是:当服务器获取所有这些事件/消息时, app2不再接收这些消息。推断一下,这个经纪人的东西一定是错的,因为使用公共经纪人一切都很好。

任何帮助表示赞赏!提前谢谢。

1 个答案:

答案 0 :(得分:3)

我也无法让mqtt-server工作,所以试试莫斯卡。

如果你想发送QOS1 / 2消息,Mosca只需要一个后端,它可以不用一个。

var mosca = require('mosca');

var settings = {
    port:1883
}

var server = new mosca.Server(settings);

server.on('ready', function(){
  console.log("ready");
});

这将在端口1883上启动mqtt代理

您需要确保您的客户端与原始mqtt而不是websockets连接,因此请确保网址开始mqtt://