尝试使用MQTT
连接到NODEJS
服务器时出现了一个奇怪的问题:
如果我连接到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);
});
});
});
答案 0 :(得分:4)
我遇到了同样的问题,并找到了解决方案。我不是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。我无法从该链接中获取语法,但上面的代码行似乎很有用。
答案 1 :(得分:0)
今天,在当前的mqtt 4.2.5中,我在使用mqtt.connect时发现了错误消息:“ URL未定义”。我发现如果我使用mqtt 4.1.0版本,则找不到此错误。因此,您可以在json包中临时指定它,然后重新安装mqtt:
"mqtt": "4.1.0"
然后
npm install mqtt