Java SDK接入示例

本文介绍使用AMQP协议的JMS客户端接入阿里云物联网平台,接收服务端订阅消息的示例。

前提条件

已获取消费组ID,并订阅Topic消息。

准备开发环境

示例使用的开发环境如下:

下载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用户接收服务端订阅消息

本账号接收服务端订阅消息

  1. 下载Demo代码包,并解压。

  2. 打开IntelliJ IDEA,导入Demo包中的示例工程amqp-demo

    pom.xml文件中,已添加Maven依赖,下载Qpid JMS客户端。

  3. 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)

  4. 运行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用户授权服务端订阅

接入示例

  1. 下载Demo代码包,然后解压。

  2. 打开IntelliJ IDEA,导入Demo包中的示例工程amqp-sts-demo

    pom.xml文件中,已添加Maven依赖,下载Qpid JMS客户端。

  3. 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)

  4. 运行AmqpStsTokenClient.java程序。

    • 成功:返回类似如下日志信息,表示AMQP客户端已接入物联网平台并成功接收消息。

      topic = /***********/******/thing/event/property/post,
      message = 2**************7,
      content = {"temperature":29,"humidity":29,"time":1617357297270}

      参数

      说明

      topic

      设备属性上报的Topic。

      messageId

      消息的ID。

      content

      消息的内容。

    • 失败:例如代码或网络环境有问题,AMQP客户端连接物联网平台会失败。

      您可根据日志提示,检查代码或网络环境,然后修正问题,重新运行代码。

相关文档

服务端订阅消息相关错误码,请参见消息相关错误码