Node.js 通过MQTT在节点应用程序之间进行简单通信

Node.js 通过MQTT在节点应用程序之间进行简单通信,node.js,mqtt,Node.js,Mqtt,嗨,我是MQTT的新手,最近几天我读了很多关于MQTT的帖子和博客,但我似乎没有完全理解所需的不同部分,比如代理、客户 我希望两个节点应用程序通过本地mqtt服务相互通信。据我所知,这个mqtt服务被称为代理。我设法让2个节点的应用程序通过公共代理进行通信,如下所示: app1(发送方) app2(接收器) 随着这项工作的进行,我想通过将公共经纪人替换为私人来继续前进。过了一会儿,我发现是一个节点包 因此,我尝试了以下作为第三个节点应用程序,它应该是app1和app2的代理: 服务器(MQTT代

嗨,我是MQTT的新手,最近几天我读了很多关于MQTT的帖子和博客,但我似乎没有完全理解所需的不同部分,比如代理、客户

我希望两个节点应用程序通过本地mqtt服务相互通信。据我所知,这个mqtt服务被称为代理。我设法让2个节点的应用程序通过公共代理进行通信,如下所示:

app1(发送方)

app2(接收器)

随着这项工作的进行,我想通过将公共经纪人替换为私人来继续前进。过了一会儿,我发现是一个节点包

因此,我尝试了以下作为第三个节点应用程序,它应该是app1app2的代理:

服务器(MQTT代理)

问题 在app1app2中调整连接URI(均为
ws://127.0.0.1:1884
)后,服务器应用程序接收发布的所有消息,并识别有人连接并收听特定主题

但是:当服务器获取所有这些事件/消息时,app2不再接收这些消息。由此推断,这个经纪人肯定出了问题,因为使用公共经纪人一切正常


感谢您的帮助!提前感谢。

我也无法让
mqtt服务器运行,所以请尝试Mosca

如果您想发送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而不是WebSocket连接的,因此请确保URL开始
mqtt://

更新问题,以准确显示您已将客户端连接URL更改为的内容。感谢您的建议:)已更新。首先,请尝试其他代理,如果你想保持它基于nodejs或者mosquittoI的话,比如Mosca,我试过Mosca,但是我没有让它工作,因为它需要Redis(或者其他数据库),我不知道如何运行它/为什么需要它。
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);
});
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.');
});
var mosca = require('mosca');

var settings = {
    port:1883
}

var server = new mosca.Server(settings);

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