【问题标题】:Subscribing Multiple Topics, using wildcards or creating instances?订阅多个主题,使用通配符还是创建实例?
【发布时间】:2015-06-02 14:54:30
【问题描述】:

我目前正在进行一个项目,其中包括使用 MQTT。我正在用 node.js 编写我的应用程序。我的项目需要连接/通信到每个设备指定的多个设备和不同的主题。稍后,来自每条消息的数据将存储到数据库(MongoDB)中。我正在使用来自 npmjs.com 1 的 mqtt 包。

以下是mqtt封装代码示例:

var mqtt    = require('mqtt');
var client  = mqtt.connect('mqtt://test.mosquitto.org'); 
client.on('connect', function () {
    client.subscribe('presence');
    client.publish('presence', 'Hello mqtt');
});
client.on('message', function (topic, message) {
    // message is Buffer 
    console.log(message.toString());
    client.end();
});

我的问题是我应该怎么做才能从设备中获取消息。我可以使用“#”轻松列出单个主题以获取所有主题,但我必须手动排序/拆分主题等。

但是,我正在考虑另一种选择,我将为每个主题创建新的 mqtt 客户端实例,但我不知道是否有任何实例限制。我可能会使用来自异步包2 的forever 函数。我的代码可能是这样的:

var async = require('async');
var mqtt = require('mqtt');
var client = mqtt.connect("URL of MQTT broker");

var _topic = "";

var Subscriber = function(topic){
    this._topic = topic;
    client.on('connect', function () {
        client.subscribe(this.topic.setter);
    });
    async.forever(
        function(next){ 
        client.on('message', function (topic, message) {
            // TO DO store message
        });
    },
        function(err){
            client.end();
        }
    );
};

module.exports = Subscriber;

有人推荐吗?

【问题讨论】:

    标签: node.js mongodb mqtt


    【解决方案1】:

    我不建议为您要进行的每个订阅创建单独的连接。每个连接都是一个新的 TCP 连接,会浪费您的应用程序和代理中的资源。

    这里的正常模式是使用通配符订阅。消息回调处理程序被传递给消息出现的主题,因此,只要您合理地构建主题空间,必须在应用程序中适当地路由消息的开销非常小。

    【讨论】:

    • 如何使用通配符订阅?代码会很好。
    • 例如,假设您订阅了以下格式的通配符主题:big/#,那么您的客户端将订阅以 big/ 开头的所有主题,例如 big/ladbig/man/arm 。如果您改为订阅主题my/+/life,则另一个通配符是+字符,您的客户端将订阅my/cool/lifemy/bad/life等主题,但不是my/life。总结:#是递归主题级别的通配符。 + 是单个主题级别的通配符。
    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2018-06-27
    • 2021-10-14
    • 2014-01-21
    • 1970-01-01
    相关资源
    最近更新 更多