WSO2 - 使用MQTT消息的DAS

时间:2015-12-02 15:51:31

标签: activemq mqtt raspberry-pi2 kura wso2-das

我正在使用Eclipse Kura 1.2.2,WSO2 DAS 3.0.0和ActiveMQ 5.12.1在物联网世界中进行一些实验。到目前为止,我设法将DAS设置为M2M中间件服务器,将Kura设置为Raspberry PI2作为IoT网关,将ActiveMQ设置为MQTT服务器。

我还写了一个非常基本的MQTT消息生成器,它定期向MQTT服务器发送一个非常简单的MQTT消息,以模拟发送MQTT消息的实际设备。我们的想法是用BlueTooth设备定期发送数据来替换这个应用程序。

当我使用MQTTSpy监视传入消息时,我注意到MQTT消息是二进制格式的。这在文档中明确说明,因为Kura在使用MQTT发送数据时使用Google协议缓冲区。由于DAS不支持这种类型的MQTT消息,我认为这会导致服务器不响应任何传入消息。

我使用以下定义配置了DAS流:

{
  "streamId": "mqtt_sample_01:1.0.0",
  "name": "mqtt_sample_01",
  "version": "1.0.0",
  "nickName": "mqtt_sample_01",
  "description": "mqtt_sample_01",
  "metaData": [],
  "correlationData": [],
  "payloadData": [
    {
      "name": "temperature",
      "type": "FLOAT"
    }
  ]
}

我还使用以下代码为传入的MQTT消息创建了一个接收器:

<?xml version="1.0" encoding="UTF-8"?>
<eventReceiver name="mqtt_sample_receiver_protobuf" statistics="disable" trace="disable" xmlns="http://wso2.org/carbon/eventreceiver">
    <from eventAdapterType="mqtt-protobuf">
        <property name="topic">mqtt-sender-topic/mqtt-client-01/MQTT_APP_V1/mydata</property>
        <property name="clientId">mqtt-client-01</property>
        <property name="url">tcp://192.168.1.42:1883</property>
        <property name="cleanSession">false</property>
    </from>
    <mapping customMapping="disable" type="map"/>
    <to streamName="mqtt_sample_01" version="1.0.0"/>
</eventReceiver>

注意:我也尝试过将JSON和XML作为映射类型。

要在DAS控制台上显示所有内容,我使用以下内容添加了发布者:

<?xml version="1.0" encoding="UTF-8"?>
<eventPublisher name="mqtt_sample_logger_01" statistics="disable" trace="disable" xmlns="http://wso2.org/carbon/eventpublisher">
    <from streamName="mqtt_sample_01" version="1.0.0"/>
    <mapping customMapping="disable" type="text"/>
    <to eventAdapterType="logger">
        <property name="uniqueId">mqtt_sample_logger_01</property>
    </to>
</eventPublisher>  

Kura使用Google协议缓冲区格式化MQTT消息,WSO2-DAS无法理解。为了解决这个问题,存在一些可能性:

  1. 可以在Kura更改MQTT消息格式,以便不使用Google协议缓冲区进行编码。我发现article on SOthis approach或多或少相似,导致CloudClient类提供的所有优势都丧失了。
  2. 可能是按this articlethis article中所述编写您自己的DAS接收器。
  3. 第三种选择是浏览Kura代码并创建自己的CloudService / CloudClient实现实现。
  4. 我个人认为,最好的解决方案是选择第二种方案,编写一个自定义事件接收器,用于理解和解码Kura生成的Google协议缓冲格式。其他甚至更好的解决方案也非常受欢迎。

      

    重要提示:
      ActiveMQ对GUI中的主题名称使用点表示法(mqtt-sender-topic.mqtt-client-01.MQTT_APP_V1.mydata)。但该主题的真实名称使用/ -notation(mqtt-sender-topic / mqtt-client-01 / MQTT_APP_V1 / mydata)。

    为了构建自定义接收器,我决定从原始MQTT接收器复制现有代码并对其进行更改以处理protobuf格式并将其转换为XML(至少这是个想法)。在努力使所有依赖项设置正确之后,我设法构建了一个可用的自定义接收器。

    不幸的是,我们并不完全是我想要的地方。与MQTT代理的连接似乎存在问题。接收器启动但似乎经常在日志中写入以下消息而失去连接。

    DEBUG {test.wso2.mqtt.receiver.internal.util.MQTTProtobufAdapterListener} -  MQTT client subscribed to : mqtt-sender-topic/mqtt-client-01/MQTT_APP_V1/mydata
    INFO {test.wso2.mqtt.receiver.internal.util.MQTTProtobufAdapterListener} -  MQTT Connection successful
    WARN {test.wso2.mqtt.receiver.internal.util.MQTTProtobufAdapterListener} -  MQTT connection not reachable
    Connection lost (32109) - java.io.EOFException
    at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:138)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.io.EOFException
    at java.io.DataInputStream.readByte(DataInputStream.java:267)
    at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:56)
    at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:100)
    ... 1 more
    

    对于它的价值,经纪人(ActiveMQ)抱怨说:

    WARN Stealing link for clientId mqtt-client-01 From Connection Transport Connection to: tcp://192.168.1.42:4594
    

    我的代码肯定会做错,导致连接被删除。问题是什么。所以任何建议,想法和解决方案再次受到欢迎!

      

    HINT
      使用-DosgiConsole选项启动DAS,允许您调查已部署捆绑包的状态。成功部署接收器后,命令 diag [bundle_number] 应输出如下内容:
      OSGi的&GT;诊断473
      参考:file:../ dropins / test.wso2.mqtt.receiver.MqttProtobufReceiver-&gt; 1.0.0.jar [473]
      没有未解决的限制。

1 个答案:

答案 0 :(得分:0)

能够处理由Eclipse Kura(KuraPayload格式)创建的Google协议缓冲区格式化消息的WSO2产品(例如Data Analytics Server)的输入接收器示例可以是downloaded at Google Drive

发送消息的Kura示例应用程序也可以是downloaded at Google Drive

接收器接收二进制格式化的KuraPayload格式并将其转换为XML。检查示例应用程序以获取XML格式。

请分享您在接收器上做的改进/修改,以帮助他人。