このトピックでは、Advanced Message Queuing Protocol(AMQP)プロトコルを使用する Java Message Service(JMS)クライアントを Alibaba Cloud IoT Platform に接続し、サーバー側サブスクリプション機能を使用して IoT Platform からメッセージを受信する方法について説明します。
前提条件
トピックのメッセージをサブスクライブするコンシューマーグループの ID を取得します。
DEFAULT_GROUP という名前のデフォルトのコンシューマーグループを使用するか、IoT Platform コンソールでコンシューマーグループを作成できます。詳細については、「コンシューマーグループを管理する」をご参照ください。
コンシューマーグループを使用して、トピックのメッセージをサブスクライブできます。詳細については、「AMQP サーバー側サブスクリプションを設定する」をご参照ください。
開発環境
この例では、開発環境は次のコンポーネントで構成されています。
オペレーティングシステム: Windows 10
Java Development Kit (JDK): JDK 8
統合開発環境 (IDE): IntelliJ IDEA Community Edition
Apache Qpid JMS クライアントをダウンロードする
クライアントをダウンロードして手順を表示するには、Qpid JMS 0.57.0 にアクセスしてください。
この例では、Qpid JMS クライアントをダウンロードするために、次の依存関係が Maven プロジェクトに追加されます。
<!-- 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>デモ
Alibaba Cloud アカウントまたは RAM ユーザーを使用して、AMQP クライアントを使用して IoT Platform からメッセージを受信できます。たとえば、企業 A にはアカウント A という名前の Alibaba Cloud アカウントがあり、企業 B にはアカウント B という名前の Alibaba Cloud アカウントがあります。企業 A は、アカウント A を使用して IoT Platform コンソールでサーバー側サブスクリプションを設定しています。
アカウント A、または直接権限が付与されている Resource Access Management (RAM) ユーザーを使用する
説明RAM ユーザーを使用する場合は、iot:sub 操作を含む RAM ポリシーを RAM ユーザーにアタッチする必要があります。これにより、RAM ユーザーは IoT Platform のサーバー側サブスクリプション機能を使用できます。そうでない場合、接続は失敗します。詳細については、「IoT Platform API 操作と RAM ポリシー間のマッピング」をご参照ください。
データセキュリティを向上させるために、RAM ロールを使用して RAM ユーザーにサーバー側サブスクリプション機能の使用を承認することをお勧めします。詳細については、次のセクションを参照してください。
詳細については、このトピックの現在のアカウント内でサーバー側サブスクリプションメッセージを受信するセクションをご参照ください。
RAM ロールを引き受ける RAM ユーザーを使用する
使用する RAM ユーザーは、アカウント A またはアカウント B に属することができます。RAM ユーザーを使用して、アカウント A 内でアクティブ化されている IoT Platform に AMQP クライアントを接続できます。これにより、サーバー側サブスクリプション機能を使用してデバイスメッセージを受信できます。
詳細については、このトピックのRAM ロールを引き受ける RAM ユーザーとしてサーバー側サブスクリプションメッセージを受信するセクションをご参照ください。
現在のアカウント内でサーバー側サブスクリプションメッセージを受信する
デモパッケージをダウンロードして解凍します。
IntelliJ IDEA を開き、デモパッケージ内のサンプルプロジェクト amqp-demo-en をインポートします。
pom.xmlファイルでは、Qpid JMS クライアントをダウンロードするための Maven 依存関係が追加されています。src/main/java/com.aliyun.iotx.demoディレクトリのAmqpClient.javaファイルで、次の表に示す AMQP 接続パラメーターを指定します。重要有効なパラメーター値を指定していることを確認してください。そうでない場合、AMQP クライアントは IoT Platform に接続できません。
この例では、プログラムが開始して 1 分間実行された後にプログラムを終了するために、
Thread.sleep(60 * 1000);コードスニペットが追加されています。ビジネス要件に基づいて期間を指定できます。
詳細については、「AMQP クライアントを IoT Platform に接続する」をご参照ください。
パラメーター
説明
accessKey
Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID と AccessKey シークレット。
IoT Platform コンソールにログインし、右上隅のプロフィール画像にポインターを移動して、[accesskey 管理] をクリックして、AccessKey ID と AccessKey シークレットを取得します。
accessSecret
consumerGroupId
IoT Platform インスタンスのコンシューマーグループの ID。
コンシューマーグループの ID を表示するには、次の手順を実行します。IoT Platform コンソールにログインし、管理するインスタンスのカードをクリックします。左側のナビゲーションウィンドウで、 を選択します。コンシューマーグループの ID は、[コンシューマーグループ] タブに表示されます。
iotInstanceId
IoT Platform インスタンスの ID。IoT Platform コンソールの [概要] タブでインスタンス ID を表示できます。
インスタンス ID が表示されている場合は、このパラメーターをインスタンス ID に設定する必要があります。
[概要] タブが表示されていない場合、またはインスタンスに ID がない場合は、
iotInstanceId = ""の形式でこのパラメーターを空のままにします。
clientId
クライアントの ID。カスタム ID を指定する必要があります。ID は 1 ~ 64 文字の長さでなければなりません。クライアントが実行されているサーバーの UUID、MAC アドレス、IP アドレスなど、一意の識別子をクライアント ID として使用することをお勧めします。
AMQP クライアントが IoT Platform に接続して起動した後、次の手順を実行してクライアントの詳細を表示します。IoT Platform コンソールにログインし、管理する インスタンス のカードをクリックします。左側のナビゲーションウィンドウで、 を選択します。[コンシューマーグループ] タブで、管理するコンシューマーグループを見つけて、[操作] 列の [表示] をクリックします。各クライアントの ID は、[コンシューマーグループステータス] タブに表示されます。クライアント ID を使用して、クライアントを簡単に識別できます。
connectionCount
AMQP クライアントで有効になっている接続の数。最大値: 128。このパラメーターは、リアルタイムメッセージプッシュシナリオでのスケールアウトに使用されます。
[コンシューマーグループの詳細] ページでは、接続されている各クライアントが
${clientId}+"-"+ Numberとして表示されます。最小数は 0 です。host
AMQP クライアントが IoT Platform に接続するために使用するエンドポイント。
${YourHost}変数に指定できるエンドポイントの詳細については、「インスタンスのエンドポイントを管理する」をご参照ください。AmqpClient.javaプログラムを実行します。次のような出力が表示された場合、AMQP クライアントは IoT Platform に接続されており、メッセージを受信できます。
topic = /***********/******/thing/event/property/post, message = 2**************7, content = {"temperature":29,"humidity":29,"time":1617357297270}パラメーター
説明
topic
デバイスプロパティを送信するために使用されるトピック。
messageId
メッセージの ID。
content
メッセージの内容。
コードまたはネットワーク環境でエラーが発生した場合、AMQP クライアントは IoT Platform に接続できません。
ログに基づいてコードまたはネットワーク環境を確認し、問題を解決してから、コードを再実行できます。
RAM ロールを引き受ける RAM ユーザーとしてサーバー側サブスクリプションメッセージを受信する
前提条件
RAM ユーザーには、アカウント A に属する IoT Platform サーバー側サブスクリプションリソースにアクセスするための RAM ロールが割り当てられています。詳細については、「現在の Alibaba Cloud アカウントの RAM ユーザーにサーバー側サブスクリプションの使用を承認する」および「別のアカウントの RAM ユーザーにサーバー側サブスクリプションの使用を承認する」をご参照ください。
手順
デモパッケージをダウンロードして解凍します。
IntelliJ IDEA を開き、デモパッケージ内のサンプルプロジェクト amqp-sts-demo をインポートします。
pom.xmlファイルでは、Qpid JMS クライアントをダウンロードするための Maven 依存関係が追加されています。src/main/java/com/aliyun/iotx.demoディレクトリのAmqpStsTokenClient.javaファイルで、次の表に示す AMQP 接続パラメーターを指定します。重要有効なパラメーター値を指定していることを確認してください。そうでない場合、AMQP クライアントは IoT Platform に接続できません。
Security Token Service (STS) トークンは最大 1 時間有効です。AMQP クライアントが想定どおりに IoT Platform に再接続できるように、AMQP 接続パラメーターを定期的に更新する必要があります。詳細については、デモコードの
scheduledExecutorService.scheduleAtFixedRateセクションを参照してください。この例では、プログラムが開始して 1 分間実行された後にプログラムを終了するために、
Thread.sleep(6000 * 1000);コードスニペットが追加されています。ビジネス要件に基づいて期間を指定できます。
詳細については、「AMQP クライアントを IoT Platform に接続する」をご参照ください。
パラメーター
説明
CONNECTION_COUNT
AMQP クライアントで有効になっている接続の数。最大値: 128。このパラメーターは、リアルタイムメッセージプッシュシナリオでのスケールアウトに使用されます。
IoT Platform コンソールの [コンシューマーグループの詳細] ページでは、接続されている各クライアントが
"clientId-"+ Numberとして表示されます。最小数は 0 です。DURATION_SECONDS
STS トークンの有効期間。有効期間は 1 時間を超えることはできません。有効な値: 15 ~ 60。単位: 分。
STS_ENDPOINT
STS トークンを取得するために使用されるエンドポイント。詳細については、「エンドポイント」をご参照ください。
STS_ACCESS_KEY
アカウント A の RAM ロールを引き受ける RAM ユーザーの AccessKey ID と AccessKey シークレット。
STS_ACCESS_SECRET
STS_ROLE_ARN
引き受ける RAM ロールの Alibaba Cloud Resource Name (ARN)。形式:
acs:ram::<account-id>:role/<role-name>。<role-name>は、小文字の RAM ロールの名前です。RAM ロールを作成した後、ロール名をクリックして、[基本情報] セクションで ARN を表示できます。CONSUMER_GROUP_ID
サーバー側サブスクリプションメッセージをサブスクライブするコンシューマーグループの ID。
コンシューマーグループ ID を表示するには、次の手順を実行します。IoT Platform コンソールにログインし、管理するインスタンスのカードをクリックします。左側のナビゲーションウィンドウで、 を選択します。ID は [コンシューマーグループ] タブに表示されます。
IOT_INSTANCE_ID
アカウント A 内の IoT Platform インスタンスの ID。
IoT Platform コンソール にログインして、[概要] タブでインスタンス ID を表示できます。
インスタンス ID が表示されている場合は、このパラメーターをインスタンス ID に設定する必要があります。
[概要] タブが表示されていない場合、またはインスタンスに ID がない場合は、
IOT_INSTANCE_ID = ""の形式でこのパラメーターを空のままにします。
HOST
AMQP クライアントがアカウント A 内の IoT Platform インスタンスに接続するために使用するエンドポイント。詳細については、「インスタンスのエンドポイントを管理する」をご参照ください。
AmqpStsTokenClient.javaプログラムを実行します。次のような出力が表示された場合、AMQP クライアントは IoT Platform に接続されており、メッセージを受信できます。
topic = /***********/******/thing/event/property/post, message = 2**************7, content = {"temperature":29,"humidity":29,"time":1617357297270}パラメーター
説明
topic
デバイスプロパティを送信するために使用されるトピック。
messageId
メッセージの ID。
content
メッセージの内容。
コードまたはネットワーク環境でエラーが発生した場合、AMQP クライアントは IoT Platform に接続できません。
ログに基づいてコードまたはネットワーク環境を確認し、問題を解決してから、コードを再実行できます。
関連情報
サーバー側サブスクリプション機能に関連するエラーコードの詳細については、「IoT Platform ログ」トピックのメッセージに関連するエラーコードセクションをご参照ください。