RabbitMQ 的节点 MQTT.js 个问题

Node MQTT.js problems with RabbitMQ

无法使用 node.js mqtt 客户端连接到我的 RabbitMQ 服务器(已启用 MQTT 适配器)。这些之间是否存在兼容性问题?

我可以使用 bluerhinos MQTT PHP 库连接到队列,所以我知道队列名称和主机名等是正确的,并且消息正在被正确检索

Node.js 应用

var mqtt = require('mqtt');

var mqttClient = mqtt.connect('mqtt://rabbit:1883');

mqttClient.on('connect', function() {
   console.log("connected");
});

mqttClient.publish('queue', 'message');

PHP

require("vendor/bluerhinos/phpmqtt/phpMQTT.php");

$mqtt = new phpMQTT("rabbit", 1883, "clientId"); 
if ($mqtt->connect()) {
    $mqtt->publish("queue","Hello World! at ".date("r"),1);
    $mqtt->close();
}

MQTT.js默认生成一个随机的client id,所以与未设置client id无关。

NodeJS 代码将是异步的,因此您可能会在连接完成之前调用发布。试试这个以确保它在尝试发布之前等待:

var mqtt = require('mqtt');

var mqttClient = mqtt.connect('mqtt://rabbit:1883');

mqttClient.on('connect', function() {
   console.log("connected");
   mqttClient.publish('queue', 'message');
});

如果您要连接到仅支持 MQTT 3.1(不兼容 3.1.1)的代理,您应该传递这些附加选项:

{
    protocolId: 'MQIsdp',
    protocolVersion: 3
}

这在 RabbitMQ 3.2.4... 和 Mosquitto < 1.3 上得到确认。 Mosquitto 版本 1.3 和 1.4 没有这些也能正常工作。