通过节点应用程序之间的MQTT进行简单通信
您好,我对MQTT真的很陌生,在过去的日子里我已经阅读了很多关于它的文章和博客,但是我似乎并没有完全理解所需的不同部分,例如Broker,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是一个节点包。
所以我尝试了以下作为第三个节点的应用程序,它应该是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中的连接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://