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

您好,我对MQTT真的很陌生,在过去的日子里我已经阅读了很多关于它的文章和博客,但是我似乎并没有完全理解所需的不同部分,例如Br​​oker,Clients。

我想要两个节点应用程序通过本地mqtt服务相互通信。 据我所知,这个mqtt服务叫做broker。 我pipe理它让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); }); 

当这个工作,我想通过replace一个私人 公共经纪人继续前进。 过了一会儿,我发现mqtt-server是一个节点包。

所以我尝试了以下作为第三个节点的应用程序,它应该是app1app2的经纪人:

服务器(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.'); }); 

问题

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

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

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

我无法让mqtt-server工作,所以试试Mosca。

Mosca只需要一个后端,如果你想发送QOS1 / 2消息,它将无法工作。

 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连接,因此请确保url启动mqtt://