开源MQTT迁移至云消息队列 MQTT 版
本文为您介绍如何将开源MQTT客户端从其他开源MQTT服务端迁移至阿里云的云消息队列 MQTT 版服务端上。
背景信息
云消息队列 MQTT 版拥有多协议、多语言平台的开发能力,并支持设备级权限控制以及SSL/TLS传输加密,您可以不变更开源客户端,仅通过变更接入点和权限配置,将客户端从开源MQTT服务端迁移至云消息队列 MQTT 版上以获取更高的安全性、稳定以及更完善的运维能力。
本文以Java语言为例,为您介绍如何变更开源客户端SDK相关参数,以便能够接入云消息队列 MQTT 版服务端。
具体操作流程如下:
使用限制
若迁移前使用的服务端为EMQX开源服务端,则原系统Topic不可用。例如$delayed、$share等以$开头的Topic。
迁移前使用过的开源MQTT客户端必须符合MQTT 3.1.1协议。
云消息队列 MQTT 版客户端不支持使用自定义用户名/密码方式连接。如原MQTT客户端使用自定义用户名/密码方式鉴权,则迁移后需要使用和自定义用户名/密码方式相近的一机一密或签名认证方式。
签名认证方式的访问凭证在阿里云账号下维护,一机一密认证方式的访问凭证由设备端自行维护。更多信息,请参见鉴权概述。
步骤一:创建云消息队列 MQTT 版资源
创建实例
登录云消息队列 MQTT 版控制台,并在左侧导航栏单击实例列表。
在顶部菜单栏选择目标地域,然后在页面左上角单击创建实例。
在弹出的付费方式面板中,选择按需选择包年包月或Serverless 按量付费,然后单击确定。
在弹出的商品购买页中,选择实例类型和各计费项的规格,然后单击立即购买。
云消息队列 MQTT 版支持的实例类型及功能差异,请参见实例类型。
在确认订单页面,根据提示完成支付。
创建Topic
登录云消息队列 MQTT 版控制台,并在左侧导航栏单击实例列表。
在顶部菜单栏选择目标地域,然后在实例列表中单击实例名称进入实例详情页面。
- 在左侧导航栏单击Topic 管理,然后在页面左上角,单击创建 Topic。
- 在创建Topic面板中,输入要创建的Topic名称和描述,然后在左下角单击确定。
创建Group
登录云消息队列 MQTT 版控制台,并在左侧导航栏单击实例列表。
在顶部菜单栏选择目标地域,然后在实例列表中单击实例名称进入实例详情页面。
- 在左侧导航栏单击Group 管理,然后在页面左上角单击创建 Group。
- 在创建Group面板中,输入Group ID,然后在左下角单击确定。
步骤二:开源SDK参数映射
引入SDK依赖
在原客户端SDK的pom.xml文件中增加以下依赖:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.48</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-onsmqtt</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.0</version>
</dependency>
引入签名方法
使用签名认证方式进行认证的客户端,需要引入签名算法作为mqttConnectOptions.setPassword
传入的用户密码。
Tools.macSignature(clientId, secretKey).toCharArray()
具体代码示例,请参见Demo工程。
SDK参数值修改
您需要将SDK代码中的参数值修改为云消息队列 MQTT 版相关的参数值。
方法 | 待更新参数 | 说明 |
| broker:云消息队列 MQTT 版实例的接入点。 | 取值格式为:tcp:<Endpoint>:1883。Endpoint在云消息队列 MQTT 版控制台实例详情页面的终端SDK接入点区域获取。 取值示例如下:tcp://mqtt-cn-******.mqtt.aliyuncs.com:1883。 |
clientId:客户端ID。 | clientId的取值格式为<GroupID>@@@<DeviceID>。GroupID在云消息队列 MQTT 版控制台创建,具体操作,请参见步骤一:创建云消息队列 MQTT 版资源;DeviceID由用户自定义。 GroupID、DeviceID以及clientId的取值规范,请参见客户端限制。 取值示例如下:GID_test@@@device001。 | |
| topic:云消息队列 MQTT 版的Topic。 | Topic在云消息队列 MQTT 版控制台创建,具体操作,请参见步骤一:创建云消息队列 MQTT 版资源。 |
| UserName:客户端鉴权时使用的访问凭证。 | 具体设置方法,请参见鉴权概述。 |
| Password:客户端鉴权时使用的访问凭证密码。 | 具体设置方法,请参见鉴权概述。 |
步骤三:发布订阅
参数修改完成后启动开源SDK客户端,将开源客户端接入云消息队列 MQTT 版服务端进行消息收发。
相关参考
共享订阅
如果您需要使用共享订阅能力,可以使用云消息队列 MQTT 版提供的云端SDK。
云端SDK可用于云端分布式应用部署,天然支持共享订阅,并提供消息收发、消息订阅、客户端上下线事件通知等能力,目前支持Java、Go语言的SDK。更多信息,请参见云端开发概述。
云端SDK支持在云消息队列 MQTT 版服务端层面进行订阅发布,而非支持MQTT协议。