2015-04-07 29 views
0

WebSocket的MQTT我建立了一個ActiveMQ代理通過TCP和WebSockets向充當MQTT經紀人如下:內嵌的ActiveMQ

BrokerService broker = new BrokerService(); 
broker.addConnector("mqtt://localhost:1883"); 
broker.addConnector("ws://0.0.0.0:1884"); 
broker.setPersistent(false); 
broker.setBrokerName("default"); 
broker.start(); 

在我的類路徑中,我有以下罐子(因爲我不想有包括SLF4J):

activemq-broker-5.11.1.jar   activemq-stomp-5.11.1.jar 
activemq-client-5.11.1.jar   activemq-web-5.11.1.jar 
activemq-http-5.11.1.jar   commons-codec-1.6.jar 
activemq-mqtt-5.11.1.jar   geronimo-j2ee-management_1.1_spec-1.0.1.jar 
activemq-openwire-legacy-5.11.1.jar  geronimo-jms_1.1_spec-1.1.1.jar 
activemq-parent-5.11.1    hawtbuf-1.11.jar 
activemq-spring-5.11.1.jar   mqtt-client-1.10.jar 
javax.servlet-api-3.1.0.jar 
javax.servlet.jsp.jstl-1.2.1.jar 
javax.servlet.jsp.jstl-api-1.2.1-2.jar 
jetty-all-9.2.8.v20150217.jar 
slf4j-api-1.7.5 
logback-classic-1.0.13 
logback-core-1.0.13 

當我嘗試使用JavaScript客戶端搞得暈頭轉向,而我的mosquitto客戶管理通過TCP沒有麻煩連接泛美衛生組織連接。

在日誌中,我發現這個行:

DEBUG o.a.a.t.ws.jetty9. MQTTSocket - Waiting for StompSocket to be properly started... 

讀我發現了代碼MQTTSocket(它與StompSocket相同;試圖兩者)正在等待,只會在倒計時的CountDownLatch對象DOSTART()。顯然doStart()永遠不會被調用。爲什麼?我怎麼稱呼它?我錯過了什麼?

我的HTML/JavaScript的:

<!DOCTYPE html> 
<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> 
    <script src="shared/mqttws31-min.js" type="text/javascript"></script> 
    <script type="text/javascript"> 

    //sample HTML/JS script that will publish/subscribe to topics in the Google Chrome Console 
    //by Matthew Bordignon @bordignon on twitter. 

    var wsbroker = "127.0.0.1"; //mqtt websocket enabled broker 
    var wsport = 1884 // port for above 

    var client = new Paho.MQTT.Client(wsbroker, wsport, "", 
     "myclientid_" + parseInt(Math.random() * 100, 10)); 

    client.onConnectionLost = function (responseObject) { 
     console.log("connection lost: " + responseObject.errorMessage); 
    }; 

    client.onMessageArrived = function (message) { 
     console.log(message.destinationName, ' -- ', message.payloadString); 
    }; 

    var options = { 
     timeout: 300, 
     //mqttVersion: 3, // to constrain the protocol to version 3 
     onSuccess: function() { 
     console.log("mqtt connected"); 
     // Connection succeeded; subscribe to our topic, you can add multile lines of these 
     client.subscribe('/World', {qos: 1}); 


     //use the below if you want to publish to a topic on connect 
     message = new Paho.MQTT.Message("Hello"); 
     message.destinationName = "/World"; 
     client.send(message); 

     }, 
     onFailure: function (message) { 
     console.log("Connection failed: " + message.errorMessage); 
     } 
    }; 

    function init() { 
     client.connect(options); 
    } 

    </script> 
    </head> 
    <h1>MQTT test</h1> 
    <body onload="init();"> 
    </body> 

</html> 

編輯: 我也試過xbeans用自帶的ActiveMQ的改編XML文件配置:

System.setProperty("activemq.conf", "conf"); 
System.setProperty("activemq.data", "data"); 

BrokerService broker; 
try { 
    broker = BrokerFactory.createBroker("xbean:activemq.xml"); 
    broker.start(); 
} catch (Exception e1) { 
    e1.printStackTrace(); 
} 

XML文件:

+0

使用jetty8它能夠獨立地連接觸發額外的27行的:」 mqttVersion:3, 「 開啓和關閉。但是,仍然不能發送或接收消息。仍然認爲這是一個配置問題,甚至可能與碼頭? – lukas83

回答

0
  1. 我想broker.addConnector("ws://0.0.0.0:1884"); 應該broker.addConnector("ws://localhost:1884");

  2. 我已經寫了,併成功一個BrokerServiceMQTT,並與WS運行,從我懷疑你錯過的地方開始websocket-server

請注意,jetty-allwebsocket-server版本取決於activemq-http版本。這些是我gradle這個依賴性:

compile group: "org.apache.activemq", version: "5.11.+", name: "activemq-all" 

    compile group: "org.apache.activemq", version: "5.11.+", name: "activemq-mqtt" 

    compile group: "org.apache.activemq", version: "5.11.+", name: "activemq-http" 

    compile group: "org.eclipse.jetty.aggregate", version: "8.+", name: "jetty-all" 

    compile group: "org.eclipse.jetty.websocket", version: "9.+", name: "websocket-server" 
  • 可以指定單個連接器的性能如具有此名稱:
  • TransportConnector連接器=新TransportConnector();

    connector = new TransportConnector(); 
    connector.setUri(new URI("mqtt://localhost:1883")); 
    connector.setName("MQTTConn"); 
    broker.addConnector(connector); 
    
    connector = new TransportConnector(); 
    connector.setUri(new URI("ws://localhost:1884")); 
    connector.setName("WSConn"); 
    broker.addConnector(connector); 
    
    +0

    泰西,謝謝你的回答!我試過(1); 「0.0.0.0」和「localhost」都起作用。對於(2和3):當我打開我的碼頭時,所有(8和9)都有一個websocket文件夾。我設法讓它與jetty8一起工作。 Jetty9似乎暫時無法工作。不幸。我會用activemq-6來試試它。 – lukas83