デバイスがIoT Platformにデータを送信した後、IoT Platformからデバイスにコマンドを送信して、ダウンストリームメッセージングをテストできます。 このトピックでは、Pub操作を呼び出して、クラウドアプリケーションからサーモスタットデバイスにコマンドを送信する方法について説明します。
前提条件
サーモスタットデバイスはIoT Platformに接続されています。 詳細については、「デバイスをIoT Platformに接続してデータを送信する」をご参照ください。
開発環境の準備
この例では、クラウドAPI操作を呼び出してデバイスにコマンドを送信するサンプルプログラムが、amqp-demoプロジェクトで開発され、AMQP (Advanced Message Queuing Protocol) クライアントと同じビジネスサーバーに存在します。 環境設定の詳細については、「開発環境の準備」をご参照ください。
手順
この例では、カスタムトピックを使用してコマンドを送信します。 Thing Specification Language (TSL) 固有のトピックを使用して、TSLデータを送信できます。 詳細については、「TSLモデルとは」をご参照ください。
amqp-demo/pom.xmlファイルで、次の依存関係を追加してクラウドSDKをインポートします。IoT Platform SDK for Javaのインポートに使用されるMaven依存関係:
<!-https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-iot-> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-iot</artifactId> <version>7.41.0</version> </dependency>Alibaba Cloud SDK for Javaのインポートに使用されるMaven依存関係。
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.6.3</version> </dependency>
src/main/java/com.aliyun.iotx.de moディレクトリで、PubDemo.javaという名前のクラスファイルを作成し、次のサンプルコードをファイルにコピーします。com.aliyuncs.DefaultAcsClientをインポートします。com.aliyuncs.IAcsClientをインポートします。com.aliyuncs.exceptions.ClientExceptionをインポートします。com.aliyuncs.exceptions.ServerExceptionをインポートします。com.aliyuncs.profile.DefaultProfileをインポートします。com.google.gson.Gsonをインポートします。com.aliyuncs.iot.mo del.v20180120.* をインポートします。public class PubDemo { public static void main(String[] args) throws Exception { DefaultProfile profile = DefaultProfile.getProfile("${RegionId}", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); IAcsClient client = new DefaultAcsClient(profile); PubRequest request = new PubRequest(); request.setIotInstanceId("iot-cn-******"); request.setProductKey("a2 ******"); request.setTopicFullName("/a2 ******/Device1/user/get"); request.setMessageContent("eyJ0ZXN0IjoidGFzayBwdWIgYnJvYWRjYXN0In0="); try { PubResponse response = client.getAcsResponse(request); System.out.println(new Gson().toJson(response)); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { System.out.println("ErrCode:" + e.getErrCode()); System.out.println("ErrMsg:" + e.getErrMsg()); System.out.println("RequestId:" + e.getRequestId()); } } }実際のシナリオでは、上記のサンプルコードの特定のパラメーターを変更する必要があります。 次の表にパラメーターを示します。
パラメーター
例
説明
RegionId
ap-northeast-1
DefaultProfile.getProfileファイルの${RegionId}変数を、IoT Platformをアクティブ化したリージョンのIDに置き換えます。 Alibaba CloudリージョンIDの詳細については、「サポートされているリージョン」をご参照ください。TopicFullName
/a2 ****** /デバイス1 /ユーザー /取得
メッセージを公開するカスタムトピック。
この例では、カスタムトピック
/${productKey}/${deviceName}/user/getが使用されています。${productKey}をサーモスタットデバイスのProductKeyに置き換え、${deviceName}をDevice1に置き換えます。詳細については、「通信にカスタムトピックを使用する」をご参照ください。
ProductKey
a2 ******
サーモスタットデバイスが属する製品のProductKey。
IotInstanceId
iot-cn-******
IoT_Test_EnvironmentインスタンスのID。
インスタンスIDは、IoT Platformコンソールの [概要] タブで確認できます。
MessageContent
eyJ0ZXN0IjoidGFzayBwdWIgYnJvYWRjYXN0In0=
送信するメッセージ本文。 元のメッセージをバイナリデータに変換し、データに対してBase64エンコードを実行すると、メッセージ本文が生成されます。 この例では、MessageContentパラメータの値は、
「washingMode: 2, washingTime: 30」メッセージコンテンツからエンコードされています。PubMessage.javaファイルの実行後に次の情報が返された場合、メッセージはデバイスに送信されます。{"requestId":"6EF6 ****-****-5 ***-*** 7-D2 ******** 48" 、"success":true、"messageId":"170440 ************"}IoT Platformコンソールの対応するインスタンスの [インスタンスの詳細] ページに移動します。 左側のナビゲーションウィンドウで、 > クラウド実行ログを選択します。 [クラウド実行ログ] タブで、デバイスのAPI呼び出しに関連するログを表示します。

デバイスでMessageContentパラメーターの値を表示することもできます。
[1695199345.900][LK-0309] パブ: /a2 ******/Device1/user/get [LK-030A] < 77 61 73 68 69 6E 67 4D 6F 64 65 3A 20 32 2C 20 | washingMode: 2、[LK-030A] < 77 61 73 68 69 6E 67 54 69 6D 65 3A 20 33 30 | washingTime: 30