【问题标题】:Why is MQTT not connecting with NodeJS?为什么 MQTT 没有与 NodeJS 连接?
【发布时间】:2016-02-11 18:57:06
【问题描述】:

我在尝试使用NODEJS 连接到MQTT 服务器时遇到了一个奇怪的问题:

如果我连接到MQTT 服务器并且我没有得到连接,它就会挂起。

如果我使用命令行执行此操作,我会看到数据,因此网络、服务器等都很好。

如果我使用了错误的端口,那么命令行会给我一个有效的拒绝消息,但 NODE 只是挂起。

命令行是:

mosquitto_sub -h 10.10.10.30 -p 1883 -t sim 

我的代码完全是基本的:

var mqtt = require('mqtt');

var MQTT_TOPIC          = "sim";
var MQTT_ADDR           = "10.10.10.30";
var MQTT_PORT           = 1883;
var client = mqtt.connect({host: MQTT_ADDR, port : MQTT_PORT, debug: true});

client.on('connect', function() {
    console.log('Connected');
    client.subscribe(MQTT_TOPIC, function() {
        client.on('message', function(topic, message, packet) {
            console.log(topic + ": '" + message);
        });
    });
});

【问题讨论】:

  • 你运行的是什么版本的 mosquitto?
  • 遇到了同样的问题。在使用 mosquitto_sub 时有效,但在 nodejs 中实现订阅者时无效。

标签: node.js mqtt


【解决方案1】:

我遇到了同样的问题,并想出了一个解决方案。我不是 node.js 专家,所以这只是一个反复试验的案例。也许其他人可以详细说明真正的问题。

此连接字符串适用于我:var client = mqtt.connect(MQTT_ADDR,{clientId: 'bgtestnodejs', protocolId: 'MQIsdp', protocolVersion: 3, connectTimeout:1000, debug:true});

下面的完整示例:

var mqtt = require('mqtt');

var MQTT_TOPIC          = "hello";
var MQTT_ADDR           = "mqtt://192.168.0.105";
var MQTT_PORT           = 1883;

/* This is not working as expected */
//var client = mqtt.connect({host: MQTT_ADDR, port:MQTT_PORT},{clientId: 'bgtestnodejs'});

/* This works... */
var client  = mqtt.connect(MQTT_ADDR,{clientId: 'bgtestnodejs', protocolId: 'MQIsdp', protocolVersion: 3, connectTimeout:1000, debug:true});

client.on('connect', function () {
    client.subscribe(MQTT_TOPIC);
    client.publish(MQTT_TOPIC, 'Hello mqtt');
});

client.on('message', function (topic, message) {
    // message is Buffer
    console.log(message.toString());
    client.end();
});

client.on('error', function(){
    console.log("ERROR")
    client.end()
})

Mosquitto 似乎要求按上述方式设置 protocolId 和 protocolVersion。 此外,请注意主机和端口未包含在选项中,而是作为第一个参数给出。

如果我正确阅读了文档,则不应将主机和端口参数作为选项的一部分提供,而应作为“服务器”选项在选项之前提供。请参阅此link。我无法从该链接中获取语法来工作,但上面的代码行似乎是诀窍。

【讨论】:

  • 非常感谢!我花了几个小时试图解决这个问题,直到我找到你的帖子!
  • 这是正确答案。非常感谢!无法理解为什么当使用 IP 而不是域名时,mqtt.connect() 不起作用。
  • 查看npmjs.com/package/mqtt npm 的文档,似乎问题来自运行的 mosquitto 版本。对于 Mosquitto
【解决方案2】:

今天,在当前的 mqtt 4.2.5 中,我在使用 mqtt.connect 时发现错误消息:“未定义 URL”。我发现如果我使用 mqtt 4.1.0 版本没有发现这个错误。所以可以临时在包json中指定,重新安装mqtt:

"mqtt": "4.1.0"

然后

npm install mqtt

【讨论】:

  • @ichimaru 您可以尝试在 node_modules 中删除以前版本的 mqtt,以防在您的源代码中找到的其他版本上没有指定任何内容
猜你喜欢
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 2020-05-10
  • 2019-07-10
  • 1970-01-01
  • 2015-12-16
相关资源
最近更新 更多