本文介绍使用AMQP协议的JMS客户端接入阿里云物联网平台,接收服务端订阅消息的示例。
前提条件
已获取消费组ID,并订阅Topic消息。
管理AMQP消费组:您可使用物联网平台默认消费组(DEFAULT_GROUP)或创建消费组。
配置AMQP服务端订阅:您可通过消费组订阅需要的Topic消息。
准备开发环境
示例使用的开发环境如下:
操作系统:Windows10
JDK版本:JDK8
集成开发环境:IntelliJ IDEA社区版
下载Apache Qpid JMS客户端
您可访问Qpid JMS 0.57.0,查看Qpid JMS使用说明。
本文示例中,通过在Maven工程中添加如下依赖,下载Qpid JMS客户端。
<!-- amqp 1.0 qpid client -->
<dependency>
<groupId>org.apache.qpid</groupId>
<artifactId>qpid-jms-client</artifactId>
<version>0.57.0</version>
</dependency>
<!-- util for base64-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
示例Demo
假设企业A和企业B分别有一个阿里云主账号A和阿里云主账号B,企业A使用阿里云主账号在物联网平台已配置服务端订阅:
对于阿里云主账号A或其下直接授权的RAM用户
说明对于直接授权的RAM用户,需要给该RAM用户授予操作AMQP服务端订阅功能的权限(iot:sub),否则将会连接失败。授权方法,请参见物联网平台RAM授权说明。
为提升物联网平台数据安全,推荐通过RAM角色授予RAM用户指定的操作权限。具体说明,请参见下文。
开发AMQP客户端接收服务端订阅的设备消息,请参见本账号接收服务端订阅消息。
对于通过RAM角色授权的RAM用户
RAM用户可为阿里云主账号A下的RAM用户,或阿里云主账号B下的RAM用户,即支持使用本账号(阿里云主账号A)和跨账号(阿里云主账号B)的RAM用户,开发AMQP客户端接入本账号的物联网平台,接收服务端订阅的设备消息。
开发AMQP客户端接收服务端订阅的设备消息,请参见通过RAM角色授权的RAM用户接收服务端订阅消息。
本账号接收服务端订阅消息
下载Demo代码包,并解压。
打开IntelliJ IDEA,导入Demo包中的示例工程amqp-demo。
在
pom.xml
文件中,已添加Maven依赖,下载Qpid JMS客户端。在
src/main/java/com.aliyun.iotx.demo
目录下AmqpClient.java
文件中,参照下表,修改AMQP的接入信息。重要请确保参数值输入正确,否则AMQP客户端接入会失败。
本示例Demo代码中,添加了结束程序的代码(
Thread.sleep(60 * 1000);
),即程序启动成功,运行一分钟后会结束。实际场景中,您可根据需要自行设置运行时间。
更多参数说明,请参见AMQP客户端接入说明。
参数
说明
accessKey
阿里云主账号或对应RAM用户的AccessKey ID和AccessKey Secret。
登录物联网平台控制台,将鼠标移至账号头像上,然后单击AccessKey管理,获取AccessKey ID和AccessKey Secret。
accessSecret
consumerGroupId
当前物联网平台对应实例中的消费组ID。
登录物联网平台控制台,在对应实例的
查看您的消费组ID。iotInstanceId
实例ID。您可在物联网平台控制台的实例概览页面,查看当前实例的ID。
若有ID值,必须传入该ID值。
若无实例概览页面或ID值,传入空值,即
iotInstanceId = ""
。
clientId
表示客户端ID,需您自定义,长度不可超过64个字符。建议使用您的AMQP客户端所在服务器UUID、MAC地址、IP等唯一标识。
AMQP客户端接入并启动成功后,登录物联网平台控制台,在对应实例的 页签,单击消费组对应的查看,消费组详情页面将显示该参数,方便您识别区分不同的客户端。
connectionCount
启动AMQP客户端的连接数,最大不超过128个。用于实时消息推送的扩容。
消费组详情页面会以
${clientId}+"-"+数字
形式,显示连接的客户端。其中数字最小值为0。host
AMQP接入域名。
${YourHost}
对应的AMQP接入域名信息,请参见查看和配置实例终端节点信息(Endpoint)。运行
AmqpClient.java
程序。成功:返回类似如下日志信息,表示AMQP客户端已接入物联网平台并成功接收消息。
topic = /***********/******/thing/event/property/post, message = 2**************7, content = {"temperature":29,"humidity":29,"time":1617357297270}
参数
说明
topic
设备属性上报的Topic。
messageId
消息的ID。
content
消息的内容。
失败:例如代码或网络环境有问题,AMQP客户端连接物联网平台会失败。
您可根据日志提示,检查代码或网络环境,然后修正问题,重新运行代码。
通过RAM角色授权的RAM用户接收服务端订阅消息
前提条件
RAM用户已通过RAM角色授权获取企业A阿里云账号物联网平台的服务端订阅操作权限。具体操作,请参见本账号RAM用户授权服务端订阅、跨账号RAM用户授权服务端订阅。
接入示例
下载Demo代码包,然后解压。
打开IntelliJ IDEA,导入Demo包中的示例工程amqp-sts-demo。
在
pom.xml
文件中,已添加Maven依赖,下载Qpid JMS客户端。在
src/main/java/com/aliyun/iotx/demo
目录下AmqpStsTokenClient.java
文件中,参照下表,修改AMQP的接入信息。重要请确保参数值输入正确,否则AMQP客户端接入会失败。
STS Token有效期最长1个小时,需要定时更新AMQP客户端接入中的建连信息,以确保AMQP客户端正常重连成功。具体修改方式可参考示例Demo代码中的
scheduledExecutorService.scheduleAtFixedRate
部分。本示例Demo代码中,添加了结束程序的代码(
Thread.sleep(6000 * 1000);
),即程序启动成功,运行一分钟后会结束。实际场景中,您可根据需要自行设置运行时间。
更多参数说明,请参见AMQP客户端接入说明。
参数
说明
CONNECTION_COUNT
启动AMQP客户端的连接数,最大不超过128个。用于实时消息推送的扩容。
本账号物联网平台的消费组详情页面会以
"clientId-"+数字
形式,显示连接的客户端。其中数字最小值为0。DURATION_SECONDS
连接参数Token有效期,不能超过1小时,取值范围:15~60分钟。
STS_ENDPOINT
STS Token获取服务接入点。具体信息,请参见服务接入点。
STS_ACCESS_KEY
扮演企业A阿里云账号下RAM角色的RAM用户的AccessKey ID和AccessKey Secret。
STS_ACCESS_SECRET
STS_ROLE_ARN
企业A阿里云账号下要扮演的RAM角色ARN,格式为
acs:ram::<account-id>:role/<role-name>
。其中,
<role-name>
部分会将角色的名称全部转换为小写。创建角色后,您可以单击角色名称,在基本信息区域查看角色ARN。CONSUMER_GROUP_ID
企业A阿里云账号下服务端订阅的消费组ID。
可在物联网平台控制台对应实例的
页签,查看消费组ID。IOT_INSTANCE_ID
企业A阿里云账号下物联网平台实例ID。
可在物联网平台控制台的实例概览页签,查看实例的ID。
若有ID值,必须传入该ID值。
若无实例概览页签或ID值,传入空值,即
IOT_INSTANCE_ID = ""
。
HOST
企业A阿里云账号下物联网平台实例的AMQP接入域名。具体信息,请参见查看和配置实例终端节点信息(Endpoint)。
运行
AmqpStsTokenClient.java
程序。成功:返回类似如下日志信息,表示AMQP客户端已接入物联网平台并成功接收消息。
topic = /***********/******/thing/event/property/post, message = 2**************7, content = {"temperature":29,"humidity":29,"time":1617357297270}
参数
说明
topic
设备属性上报的Topic。
messageId
消息的ID。
content
消息的内容。
失败:例如代码或网络环境有问题,AMQP客户端连接物联网平台会失败。
您可根据日志提示,检查代码或网络环境,然后修正问题,重新运行代码。
相关文档
服务端订阅消息相关错误码,请参见消息相关错误码。