本文介绍使用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客户端连接物联网平台会失败。 - 您可根据日志提示,检查代码或网络环境,然后修正问题,重新运行代码。 
 
相关文档
服务端订阅消息相关错误码,请参见消息相关错误码。