# 通过第三方MQTT服务接入设备

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

# 安装并启动EMQ

前往官网下载 (opens new window)安装

本文使用docker搭建

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://127.0.0.1:18083 ,默认账号密码为用户名:admin 密码:public。

emq-dashboard

# 创建MQTT客户端网络组件

  1. 选择 网络组件-->组件管理--> 点击新增组件按钮。
    insert-mqtt-client

说明

HOST:emq所在服务的ip. PORT:emq 1883端口, 根据实际启动的emq服务来调整.

  1. 在创建完成的模块上点击启动按钮。
    mqtt-client-start

# 创建MQTT客户端设备网关

  1. 选择 网络组件-->设备网关--> 点击新建按钮。 insert-mqtt-gateway

注意

Topics中输入的内容需要与实际协议包中的定义对应,本文使用官方协议进行测试.

/+/+/properties/report,/+/+/properties/write/reply,/+/+/properties/read/reply,/+/+/event/+,/+/+/child/#,/+/+/online,/+/+/offline

在集群模式下,请使用了emqx共享订阅功能 (opens new window),添加对应的前缀,如: $share/jetlinks//+/+/properties/report.

和MQTT服务设备网关不同的是,客户端必须指定消息协议,因为平台无法通过mqtt消息识别出对应的设备标识.

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

# 创建产品和设备

参考通过MQTT直连接入设备

# 使用MQTTx连接EMQ

mqttfx-config

注意:

clientId 和用户名密码符合emq规则即可,这时的认证是通过emq,而不是平台.

# 设备上下线

平台收到任意设备消息后则认为设备上线,或者推送: /{productId}/{deviceId}/online.

设备下线推送topic: /{productId}/{deviceId}/offline.

说明

{productId}请替换为平台中的产品ID,{deviceId}请替换为平台中的设备ID.

# 数据上下行

通过此方法接入对于设备端除了认证方式,上下线逻辑不同, 其他消息格式以及topic都是与使用MQTT服务网关接入设备一致的