开源MQTT迁移至云消息队列 MQTT 版

更新时间:

本文为您介绍如何将开源MQTT客户端从其他开源MQTT服务端迁移至阿里云的云消息队列 MQTT 版服务端上。

背景信息

云消息队列 MQTT 版拥有多协议、多语言平台的开发能力,并支持设备级权限控制以及SSL/TLS传输加密,您可以不变更开源客户端,仅通过变更接入点和权限配置,将客户端从开源MQTT服务端迁移至云消息队列 MQTT 版上以获取更高的安全性、稳定以及更完善的运维能力。

本文以Java语言为例,为您介绍如何变更开源客户端SDK相关参数,以便能够接入云消息队列 MQTT 版服务端。

具体操作流程如下:

image

使用限制

  • 若迁移前使用的服务端为EMQX开源服务端,则原系统Topic不可用。例如$delayed、$share等以$开头的Topic。

  • 迁移前使用过的开源MQTT客户端必须符合MQTT 3.1.1协议。

  • 云消息队列 MQTT 版客户端不支持使用自定义用户名/密码方式连接。如原MQTT客户端使用自定义用户名/密码方式鉴权,则迁移后需要使用和自定义用户名/密码方式相近的一机一密或签名认证方式。

    签名认证方式的访问凭证在阿里云账号下维护,一机一密认证方式的访问凭证由设备端自行维护。更多信息,请参见鉴权概述

步骤一:创建云消息队列 MQTT 版资源

创建实例

  1. 登录云消息队列 MQTT 版控制台,并在左侧导航栏单击实例列表

  2. 在顶部菜单栏选择目标地域,然后在页面左上角单击创建实例

  3. 在弹出的付费方式面板中,选择按需选择包年包月Serverless 按量付费,然后单击确定

  4. 在弹出的商品购买页中,选择实例类型和各计费项的规格,然后单击立即购买

    云消息队列 MQTT 版支持的实例类型及功能差异,请参见实例类型

  5. 确认订单页面,根据提示完成支付。

创建Topic

  1. 登录云消息队列 MQTT 版控制台,并在左侧导航栏单击实例列表

  2. 在顶部菜单栏选择目标地域,然后在实例列表中单击实例名称进入实例详情页面。

  3. 在左侧导航栏单击Topic 管理,然后在页面左上角,单击创建 Topic
  4. 在创建Topic面板中,输入要创建的Topic名称描述,然后在左下角单击确定

创建Group

  1. 登录云消息队列 MQTT 版控制台,并在左侧导航栏单击实例列表

  2. 在顶部菜单栏选择目标地域,然后在实例列表中单击实例名称进入实例详情页面。

  3. 在左侧导航栏单击Group 管理,然后在页面左上角单击创建 Group
  4. 在创建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 版相关的参数值。

方法

待更新参数

说明

new MqttClient(broker, clientId, persistence)

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。

sampleClient.publish(topic, message)

topic云消息队列 MQTT 版的Topic。

Topic在云消息队列 MQTT 版控制台创建,具体操作,请参见步骤一:创建云消息队列 MQTT 版资源

connOpts.setUserName()

UserName:客户端鉴权时使用的访问凭证。

具体设置方法,请参见鉴权概述

connOpts.setPassword()

Password:客户端鉴权时使用的访问凭证密码。

具体设置方法,请参见鉴权概述

步骤三:发布订阅

参数修改完成后启动开源SDK客户端,将开源客户端接入云消息队列 MQTT 版服务端进行消息收发。

相关参考

共享订阅

如果您需要使用共享订阅能力,可以使用云消息队列 MQTT 版提供的云端SDK。

云端SDK可用于云端分布式应用部署,天然支持共享订阅,并提供消息收发、消息订阅、客户端上下线事件通知等能力,目前支持Java、Go语言的SDK。更多信息,请参见云端开发概述

云端SDK支持在云消息队列 MQTT 版服务端层面进行订阅发布,而非支持MQTT协议。