【问题标题】:websocket mqtt with embedded activeMQ带有嵌入式 activeMQ 的 websocket mqtt
【发布时间】:2015-06-11 19:32:02
【问题描述】:

我设置了一个 ActiveMQ 代理,作为 tcp 和 websockets 上的 MQTT-Broker,如下所示:

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();

在我的类路径中,我有以下 jars(因为我不想包含 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

当我尝试连接 paho 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 文件:

【问题讨论】:

  • 使用 jetty8 它能够独立于切换附加线 27:"mqttVersion:3," on 和 off 进行连接。但是仍然无法发送或接收任何消息。仍然认为这是一个配置问题,甚至可能是码头?

标签: servlets websocket jetty activemq mqtt


【解决方案1】:

我在 activemq 中添加了 4 行代码,它现在可以工作了。不确定它是否会被包含在内,至少我在错误跟踪器中发布了它:
https://issues.apache.org/jira/browse/AMQ-5784
补丁:http://pastebin.com/phcsJHR5

【讨论】:

    【解决方案2】:
    1. 我猜broker.addConnector("ws://0.0.0.0:1884"); 应该是broker.addConnector("ws://localhost:1884");

    2. 我已经使用 mqttws 编写并成功运行了 BrokerService,我怀疑您缺少 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"  
    
    1. 您可以指定单独的连接器属性,例如名称:

    TransportConnector 连接器 = new 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);
    

    【讨论】:

    • 特西,谢谢您的回答!我试过(1); “0.0.0.0”和“localhost”都可以工作。对于(2 和 3):当我解压我的全部码头(8 和 9)时,有一个 websocket 文件夹。我设法让它与jetty8一起工作。 Jetty9 似乎暂时不起作用。很遗憾。我会用activemq-6试试。
    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 2019-10-25
    • 2011-05-28
    • 2012-05-13
    • 2013-01-06
    • 2018-03-17
    • 2017-07-24
    • 2014-11-21
    相关资源
    最近更新 更多