在某些场景,设备不是直接接入平台,而是通过第三方MQTT服务,如:emqtt.
消息编解码与MQTT服务一样,从消息协议中使用DefaultTransport.MQTT来获取消息编解码器.
本文使用mqtt.fx为设备端,通过emqtt接入平台。

安装并启动EMQ

可直接前往官网下载 emqttd。
本文使用docker搭建。

拉取镜像

  1. docker pull registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6

运行镜像

docker run --name emq -p 18083:18083 -p 1883:1883 -p 8084:8084 -p 8883:8883 -p 8083:8083 -d registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6

访问EMQ Dashboard

在浏览器中输入 http:192.168.99.100: 18083,默认账号密码为用户名:admin 密码:public。
emq-dashboard

创建MQTT客户端网络组件

  1. 选择 网络组件—>组件管理—> 点击新增组件按钮。
    insert-mqtt-client
  2. 在创建完成的模块上点击启动按钮。
    mqtt-client-start

    创建MQTT客户端设备网关

  3. 选择 网络组件—>设备网关—> 点击新建按钮。
    insert-mqtt-gateway
    ::: tip 注意
    和MQTT服务设备网关不同的是,客户端必须指定消息协议,因为无法通过消息识别出对应的设备标识.
    在消息解码时也无法通过上下文(MessageDecodeContext)获取到设备操作接口(DeviceOperator).
    此处使用demo协议.
    :::
    此处使用的Topics:/read-property,/device_online_status,/fire_alarm

  1. 在操作列点击启动按钮启动网关。
    mqtt-gateway-start

使用MQTT.fx连接EMQ

设置连接参数。

配置参数请参考使用MQTT.fx接入
此处参数设置:
mqttfx-config
::: tip 注意:
Client ID为设备实例Id,需在平台创建id为MQTT_FX_Client的设备实例。
:::

连接EMQ

单击 Mqtt.fx客户端 中Connect进行连接。
mqttfx-connection
连接成功后EMQ Dashboard页面上将会显示这条连接记录。
emq-connection-info

模拟设备上下线

使用MQTT.fx模拟设备上下线。

  1. 单击 Publish
  1. 输入设备上下线的topic和事件内容,点击单击Publish按钮,将消息推送到EMQ,
    EMQ将消息转发到平台。

mqttfx-device-online
此处使用的topic: /device_online_status
此处使用的事件内容:

{
   "deviceId":"MQTT_FX_Client",
   "status":"1"
}

消息发送成功后:
device-online
离线操作及效果展示:
mqttfx-device-offline
device-offline

模拟设备消息订阅

  1. 在MQTT.fx上点击Subscribe,输入topic:test,点击Subscribe按钮订阅。
    mqttfx-subscribe
  1. 在平台中选择 网络组件—>组件管理,找到MQTT客户端组件,点击调试按钮。
    mqtt-client-debug
  1. 在调试页面,选择推送消息,编辑内容后,点击发送按钮,MQTT.fx将会收到消息。

mqtt-client-message-send
mqttfx-client-message-subscribe

模拟平台读取设备属性

  1. 设备(MQTT.fx)订阅平台读取设备属性的topic。
    i. 在MQTT.fx上,单击Subscribe。
    ii. 输入平台获取设备属性的topic/read-property
    iii. 点击击Subscribe。

订阅topic

  1. 平台发送设备属性读取操作
    i. 单击设备实例页面中MQTT_FX_Client设备对应的查看链接,选择运行状态
    ii. 单击属性刷新。
    平台属性订阅操作
    iii. 订阅topic: /read-property对应的消息

订阅topic
::: tip 注意:
复制订阅该topic收到的消息中的messageId。此messageId将作为回复与平台设备属性的凭据之一
:::

  1. 设备(MQTT.fx)回复平台设备属性值
    i. 在MQTT.fx上,单击 Publish
    ii. 输入一个回复平台属性值消息Topic和要发送的消息内容,单击Publish,向平台推送该消息。
    回复设备属性

| 参数 | 说明 | | —- | —- |

| messageId | 第一步订阅平台topic“/read-property”所收到的messageId值 |

| deviceId | 设备Id |

| timestamp | 当前时间戳 |

| success | 成功标识 |

| properties | 设备属性值对象。例如: { “temperature”:”50”} |

该文档所使用的回复内容

{
    "messageId":"第一步订阅平台topic“/read-property”所收到的messageId值",
    "deviceId":"MQTT_FX_Client",
    "timestamp":"1584417135000",
    "success":true,
    "properties":{
      "temperature":"50"
     }
}

iii. 平台收到Mqtt.fx推送的属性值
平台收到属性值
iv. 读取设备属性回复的日志
设备属性读取日志

模拟设备上报事件

1.在MQTT.fx上,单击 Publish
2.输入事件上报Topic和要发送的事件内容,单击Publish按钮,向平台推送该事件消息。
设备事件上报
该文档使用的topic: /fire_alarm
该文档所使用的回复内容

{
   "deviceId":"MQTT_FX_Client",
    "pname":"智能温控",
    "aid":105,
    "a_name":"未来科技城",
    "b_name":"C2 栋",
    "l_name":"12-05-201",
    "timestamp":"2020-03-06 16:28:50",
    "alarm_type":1,
    "alarm_describe":"火灾报警",
    "event_id":1,
    "event_count":1
}

| 参数 | 说明 | | —- | —- |

| deviceId | 设备Id |

| pname | 设备型号名称 |

| aid | 区域Id |

| a_name | 区域名称 |

| b_name | 建筑名称 |

| l_name | 位置名称 |

| timestamp | 上报时间 |

| alarm_type | 报警类型 |

| alarm_describe | 报警描述 |

| event_id | 事件 ID |

| event_count | 该事件上报次数 |

3.事件上报设备日志
事件上报设备日志
4.事件上报内容
事件上报内容
事件上报内容1