Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
订阅多个主题,使用通配符还是创建实例? 我目前在一个项目中,包括使用MQTT。我正在node.js中编写应用程序。我的项目需要连接/通信到多个设备,每个设备都指定了不同的主题。稍后,来自每条消息的数据将存储到数据库(MongoDB)中。我正在使用npmjs.com上的mqtt包_Node.js_Mongodb_Mqtt - Fatal编程技术网

订阅多个主题,使用通配符还是创建实例? 我目前在一个项目中,包括使用MQTT。我正在node.js中编写应用程序。我的项目需要连接/通信到多个设备,每个设备都指定了不同的主题。稍后,来自每条消息的数据将存储到数据库(MongoDB)中。我正在使用npmjs.com上的mqtt包

订阅多个主题,使用通配符还是创建实例? 我目前在一个项目中,包括使用MQTT。我正在node.js中编写应用程序。我的项目需要连接/通信到多个设备,每个设备都指定了不同的主题。稍后,来自每条消息的数据将存储到数据库(MongoDB)中。我正在使用npmjs.com上的mqtt包,node.js,mongodb,mqtt,Node.js,Mongodb,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', functi

以下是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客户机实例,但我不知道实例是否有任何限制。我可能会使用async包中的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;

有人有什么建议吗?

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


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

如何使用通配符订阅?代码会很好。例如,假设您订阅了以下格式的通配符主题:big/#,那么您的客户将订阅所有以big/开头的主题,例如big/ladbig/man/arm。另一个通配符是+字符,如果您改为订阅主题
my/+/life
,则您的客户将订阅主题
my/cool/life
my/bad/life
,但不是
my/life
,总之:#是递归主题级通配符是单个主题级别的通配符。