You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

218 lines
7.2 KiB

# 通过第三方MQTT服务接入设备
在某些场景,设备不是直接接入平台,而是通过第三方MQTT服务,如:`emqtt`.
消息编解码与MQTT服务一样,从消息协议中使用`DefaultTransport.MQTT`来获取消息编解码器.
本文使用mqtt.fx为设备端,通过emqtt接入平台。
## 安装并启动EMQ
可直接前往[官网下载](http://www.emqtt.io/downloads/) emqttd。
本文使用docker搭建。
### 拉取镜像
```shell script
docker pull registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6
```
### 运行镜像
```shell script
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](images/third-mqtt/emq-dashboard.png)
## 创建MQTT客户端网络组件
1. 选择 `网络组件`-->`组件管理`--> 点击`新增组件`按钮。
![insert-mqtt-client](images/third-mqtt/insert-mqtt-client.png)
2. 在创建完成的模块上点击`启动`按钮。
![mqtt-client-start](images/third-mqtt/mqtt-client-start.png)
## 创建MQTT客户端设备网关
1. 选择 `网络组件`-->`设备网关`--> 点击`新建`按钮。
![insert-mqtt-gateway](images/third-mqtt/insert-mqtt-gateway.png)
::: tip 注意
和MQTT服务设备网关不同的是,客户端必须指定消息协议,因为无法通过消息识别出对应的设备标识.
在消息解码时也无法通过上下文(`MessageDecodeContext`)获取到设备操作接口(`DeviceOperator`).
此处使用`demo`协议.
:::
此处使用的Topics:`/read-property,/device_online_status,/fire_alarm`。
2. 在操作列点击`启动`按钮启动网关。
![mqtt-gateway-start](images/third-mqtt/mqtt-gateway-start.png)
## 使用MQTT.fx连接EMQ
### 设置连接参数。
配置参数请参考[使用MQTT.fx接入](../advancement-guide/mqtt-connection.md#使用MQTT.fx接入)。
**此处参数设置:**
![mqttfx-config](images/third-mqtt/mqttfx-config.png)
::: tip 注意:
Client ID为设备实例Id,需在平台创建id为`MQTT_FX_Client`的设备实例。
:::
### 连接EMQ
单击 Mqtt.fx客户端 中`Connect`进行连接。
![mqttfx-connection](images/third-mqtt/mqttfx-connection.png)
连接成功后EMQ Dashboard页面上将会显示这条连接记录。
![emq-connection-info](images/third-mqtt/emq-connection-info.png)
## 模拟设备上下线
使用MQTT.fx模拟设备上下线。
1. 单击 `Publish`
2. 输入设备上下线的topic和事件内容,点击单击Publish按钮,将消息推送到EMQ,
EMQ将消息转发到平台。
![mqttfx-device-online](images/third-mqtt/mqttfx-device-online.png)
此处使用的topic: `/device_online_status`
此处使用的事件内容:
```json
{
"deviceId":"MQTT_FX_Client",
"status":"1"
}
```
消息发送成功后:
![device-online](images/third-mqtt/device-online.png)
离线操作及效果展示:
![mqttfx-device-offline](images/third-mqtt/mqttfx-device-offline.png)
![device-offline](images/third-mqtt/device-offline.png)
## 模拟设备消息订阅
1. 在MQTT.fx上点击`Subscribe`,输入topic:`test`,点击Subscribe按钮订阅。
![mqttfx-subscribe](images/third-mqtt/mqttfx-subscribe.png)
2. 在平台中选择 `网络组件`-->`组件管理`,找到[MQTT客户端组件](#创建MQTT客户端网络组件),点击`调试`按钮。
![mqtt-client-debug](images/third-mqtt/mqtt-client-debug.png)
3. 在调试页面,选择`推送消息`,编辑内容后,点击`发送`按钮,MQTT.fx将会收到消息。
![mqtt-client-message-send](images/third-mqtt/mqtt-client-message-send.png)
![mqttfx-client-message-subscribe](images/third-mqtt/mqtt-client-message-subscribe.png)
## 模拟平台读取设备属性
1. 设备(MQTT.fx)订阅平台读取设备属性的topic。
i. 在MQTT.fx上,单击Subscribe。
ii. 输入平台获取设备属性的topic`/read-property`。
iii. 点击击Subscribe。
![订阅topic](../basics-guide/files/device-connection/mqtt-sub.png)
2. 平台发送设备属性读取操作
i. 单击设备实例页面中`MQTT_FX_Client`设备对应的`查看`链接,选择`运行状态`。
ii. 单击属性刷新。
![平台属性订阅操作](images/third-mqtt/device-property-refresh.png)
iii. 订阅topic: `/read-property`对应的消息
![订阅topic](images/third-mqtt/mqttfx-sub-read-property.png)
::: tip 注意:
复制订阅该topic收到的消息中的messageId。此messageId将作为回复与平台设备属性的凭据之一
:::
3. 设备(MQTT.fx)回复平台设备属性值
i. 在MQTT.fx上,单击 `Publish`
ii. 输入一个回复平台属性值消息Topic和要发送的消息内容,单击Publish,向平台推送该消息。
![回复设备属性](images/third-mqtt/mqttfx-replay-device-property.png)
| 参数 | 说明 |
| :----- | :----- |
| messageId | 第一步订阅平台topic“/read-property”所收到的messageId值 |
| deviceId | 设备Id |
| timestamp | 当前时间戳 |
| success | 成功标识 |
| properties | 设备属性值对象。例如: { "temperature":"50"} |
该文档所使用的回复内容
```json
{
"messageId":"第一步订阅平台topic“/read-property”所收到的messageId值",
"deviceId":"MQTT_FX_Client",
"timestamp":"1584417135000",
"success":true,
"properties":{
"temperature":"50"
}
}
```
iii. 平台收到Mqtt.fx推送的属性值
![平台收到属性值](images/third-mqtt/mqttfx-replyed-property-value.png)
iv. 读取设备属性回复的日志
![设备属性读取日志](images/third-mqtt/read-device-property-reply-log.png)
## 模拟设备上报事件
1.在MQTT.fx上,单击 `Publish`
2.输入事件上报Topic和要发送的事件内容,单击Publish按钮,向平台推送该事件消息。
![设备事件上报](images/third-mqtt/mqttfx-device-event-report.png)
该文档使用的topic: `/fire_alarm`
该文档所使用的回复内容
```json
{
"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.事件上报设备日志
![事件上报设备日志](images/third-mqtt/device-event-report-log.png)
4.事件上报内容
![事件上报内容](images/third-mqtt/device-event-info.png)
![事件上报内容1](images/third-mqtt/device-event-info1.png)