Paho Rabitmqq连接失败

时间:2016-02-09 11:11:56

标签: rabbitmq mqtt paho

这是我的paho客户端代码

// Create a client instance
client = new Paho.MQTT.Client('127.0.0.1', 1883, "clientId");

// set callback handlers
client.onConnectionLost = onConnectionLost;
client.onMessageArrived = onMessageArrived;

// connect the client
client.connect({onSuccess:onConnect});


// called when the client connects
function onConnect() {
  // Once a connection has been made, make a subscription and send a message.
  console.log("onConnect");
  client.subscribe("/World");
  message = new Paho.MQTT.Message("Hello");
  message.destinationName = "/World";
  client.send(message); 
}

// called when the client loses its connection
function onConnectionLost(responseObject) {
  if (responseObject.errorCode !== 0) {
    console.log("onConnectionLost:"+responseObject.errorMessage);
  }
}

// called when a message arrives
function onMessageArrived(message) {
  console.log("onMessageArrived:"+message.payloadString);
}  

Rabbitmq服务器上,一切都是默认的seetings。当我运行此代码时,我得到WebSocket connection to 'ws://127.0.0.1:1883/mqtt' failed: Connection closed before receiving a handshake response

我缺少什么?

2 个答案:

答案 0 :(得分:1)

问题尚不清楚,但我假设您在网络浏览器中运行上述代码。

这将通过Websockets建立MQTT连接(如错误中所示)。这与TCP连接上的本机MQTT不同。

默认的纯MQTT端口(如果是1883),Websocket支持可能位于不同的端口上。

您将需要配置RabbitMQ以接受基于Websockets的MQTT以及纯MQTT,此pull请求RabbitMQ接口以讨论添加此功能。它提到此功能仅在版本3.6.x中添加,并且文档仍然未完成(截至2016年2月9日)

答案 1 :(得分:1)

根据我在Windows上使用Paho MQTT JavaScript库和RabbitMQ代理的个人经验,这里列出了从浏览器中使用JS中的MQTT所需要做的事情:

  1. 安装rabbitmq_web_mqtt插件(您可以找到最新的二进制文件here,将其复制到" c:\ Program Files \ RabbitMQ Server \ rabbitmq_server-3.6.2 \ plugins \",并从中启用命令行使用" rabbitmq-plugins启用rabbitmq_web_mqtt"。
  2. 当然,还需要在代理
  3. 上启用MQTT插件
  4. 对我来说,客户端不使用RabbitMQ的3.6.1版本,而它在版本3.6.2(Windows)下工作正常
  5. 用于连接的端口是15675,而不是1883!
  6. 确保在制作Paho.MQTT.Client实例时指定所有4个参数。如果省略一个,则会出现websocket连接错误,这可能会产生误导。 最后,这是一个代码片段,我测试并完美地工作(只是建立连接):
  7. 
    
    	client = new Paho.MQTT.Client("localhost", 15675, "/ws", "client-1");
    
    	//set callback handlers
    	client.onConnectionLost = onConnectionLost;
    	client.onMessageArrived = onMessageArrived;
    
    	//connect the client
    	client.connect({
    		onSuccess : onConnect
    	});
    
    	//called when the client connects
    	function onConnect() {
    		console.log("Connected");
    	}
    
    	//called when the client loses its connection
    	function onConnectionLost(responseObject) {
    		if (responseObject.errorCode !== 0) {
    			console.log("onConnectionLost:" + responseObject.errorMessage);
    		}
    	}
    
    	//called when a message arrives
    	function onMessageArrived(message) {
    		console.log("onMessageArrived:" + message.payloadString);
    	}