MQTT プロトコルを使用して IoT Platform に接続するデバイスは、Topic をサブスクライブするか、Topic にメッセージを公開することで通信します。Topic は、システムトピック、TSL モデル Topic、およびカスタムトピックに分類されます。カスタムトピックはコンソールで定義する必要があります。このトピックでは、デバイスがカスタムトピックを使用して IoT Platform と通信する方法、および IoT Platform がビジネスサーバーと通信する方法について説明します。
背景情報
この例では、電子体温計がカスタムトピックをサブスクライブして命令を受信し、カスタムトピックにメッセージを公開して温度データをレポートします。IoT Platform は、AMQP サーバー側サブスクリプションを介してユーザーサーバーに温度データを転送します。ユーザーサーバーは Pub 操作を呼び出してカスタムトピックにメッセージを公開し、体温計の精度をリモートで構成します。

開発環境の準備
この例では、デバイスと IoT Platform は Java 用 SDK を使用します。したがって、Java 開発環境を準備する必要があります。Java の公式 Web サイトから Java 開発環境をダウンロードしてインストールできます。
この例では、開発環境は次のコンポーネントで構成されています。
オペレーティングシステム: Windows 10 (64 ビット)
Java 開発キット (JDK): JDK 8
統合開発環境 (IDE): IntelliJ IDEA Community Edition
プロダクトとデバイスの作成
IoT Platform コンソールにログオンします。
[概要] ページで、管理するインスタンスを見つけて、インスタンス ID またはインスタンス名をクリックします。
左側のナビゲーションウィンドウで、 を選択します。
[プロダクトの作成] をクリックして体温計プロダクトを作成し、[Productkey] (例:
a1uzcH0****) を取得します。詳細については、「プロダクトの作成」をご参照ください。
プロダクトが作成されたら、プロダクトの横にある [表示] をクリックします。
[プロダクト詳細] ページで、[Topic カテゴリ] タブをクリックし、[カスタム Topic] をクリックしてカスタム Topic カテゴリを追加します。
詳細については、「カスタムトピックを使用した通信」をご参照ください。
この例では、次の Topic カテゴリが必要です。
デバイスがメッセージを公開するための Topic: /a1uzcH0****/${deviceName}/user/devmsg、公開権限付き。
デバイスがメッセージをサブスクライブするための Topic: /a1uzcH0****/${deviceName}/user/cloudmsg、サブスクライブ権限付き。
[サーバー側サブスクリプション] タブをクリックし、[サブスクリプションの作成] をクリックして AMQP サーバー側サブスクリプションを構成します。[デフォルト使用者グループ] への [デバイスアップストリーム通知] メッセージをサブスクライブします。
[デバイスアップストリーム通知] には、カスタムトピックメッセージと TSL モデルメッセージが含まれます。詳細については、「AMQP サーバー側サブスクリプションの設定」をご参照ください。
左側のナビゲーションウィンドウで、 を選択します。次に、作成した体温計プロダクトに device1 という名前のデバイスを追加します。ProductKey、DeviceName、DeviceSecret などのデバイス証明書情報を取得します。
詳細については、「デバイスの作成」をご参照ください。
デバイスがサーバーにメッセージを送信するように設定する
次の図は、デバイスがサーバーにメッセージを送信する方法を示しています。

このセクションでは、メッセージングプロセスを実装するためにサーバーとデバイスを設定する方法について説明します。
AMQP クライアントを IoT Platform に接続し、デバイスからのメッセージをリッスンするようにクライアントを設定します。サーバーは AMQP クライアントを使用してメッセージを受信します。詳細については、「Java 用 SDK を使用して AMQP クライアントを IoT Platform に接続する」をご参照ください。
重要AMQP クライアントの使用者グループは、デバイスと同じ IoT Platform インスタンスにある必要があります。
デバイス SDK を設定してデバイスを IoT Platform に接続し、デバイスがメッセージを送信できるようにします。
デバイスを認証するためのパラメーターを設定します。
final String productKey = "a1uzcH0****"; final String deviceName = "device1"; final String deviceSecret = "uwMTmVAMnxB****"; final String region = "cn-shanghai"; final String iotInstanceId = "iot-2w****";ビジネス要件に基づいて、次の表で説明されているパラメーターを設定する必要があります。
パラメーター
例
説明
productKey
a1uzcH0****
デバイス証明書情報。IoT Platform コンソールの [デバイス詳細] ページで情報を表示できます。詳細については、「デバイス詳細の表示」をご参照ください。
deviceName
device1
deviceSecret
uwMTmVAMnxB****
region
cn-shanghai
IoT Platform デバイスが配置されているリージョンの ID。リージョン ID の詳細については、「リージョンとゾーン」をご参照ください。
iotInstanceId
iot-2w****
デバイスが属するインスタンスの ID。
IoT Platform コンソールの [概要] ページでインスタンス ID を表示できます。
インスタンス ID が表示されている場合は、このパラメーターを指定する必要があります。
インスタンスに [概要] または ID が生成されていない場合は、パラメーターに空の文字列 (
iotInstanceId = "") を指定します。
MQTT 接続パラメーター、デバイスパラメーター、TSL モデルパラメーターなど、接続を初期化するためのパラメーターを設定します。
LinkKitInitParams params = new LinkKitInitParams(); // MQTT 接続パラメーターを設定します。Link SDK は MQTT プロトコルを使用します。 IoTMqttClientConfig config = new IoTMqttClientConfig(); config.productKey = productKey; config.deviceName = deviceName; config.deviceSecret = deviceSecret; config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883"; // デバイスパラメーターを設定します。 DeviceInfo deviceInfo = new DeviceInfo(); deviceInfo.productKey = productKey; deviceInfo.deviceName = deviceName; deviceInfo.deviceSecret = deviceSecret; // デバイスの初期ステータスを指定します。 Map<String, ValueWrapper> propertyValues = new HashMap<String, ValueWrapper>(); params.mqttClientConfig = config; params.deviceInfo = deviceInfo; params.propertyValues = propertyValues;ビジネス要件に基づいてコードを修正し、パラメーターを指定する必要があります。
パラメーター
例
説明
config.channelHost
config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883";MQTT 接続のドメイン名。
古いパブリックインスタンス:
config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883";。新しいパブリックインスタンスと Enterprise Edition インスタンス:
config.channelHost = iotInstanceId + ".mqtt.iothub.aliyuncs.com:1883";。
接続を初期化します。
//接続を確立した後に呼び出されるコールバック関数を接続して設定します。 LinkKit.getInstance().init(params, new ILinkKitConnectListener() { @Override public void onError(AError aError) { System.out.println("Init error:" + aError); } // コールバック関数を実装します。 @Override public void onInitDone(InitResult initResult) { System.out.println("Init done:" + initResult); } });デバイスからメッセージを送信します。
デバイスが IoT Platform に接続された後、デバイスを使用してカスタムトピックにメッセージを送信できます。onInitDone 関数の内容を次の内容に置き換える必要があります。
@Override public void onInitDone(InitResult initResult) { // メッセージが公開される Topic とメッセージの内容を指定します。 MqttPublishRequest request = new MqttPublishRequest(); request.topic = "/" + productKey + "/" + deviceName + "/user/devmsg"; request.qos = 0; request.payloadObj = "{\"temperature\":35.0, \"time\":\"sometime\"}"; // メッセージを公開し、メッセージが公開された後に使用されるコールバック関数を設定します。 LinkKit.getInstance().publish(request, new IConnectSendListener() { @Override public void onResponse(ARequest aRequest, AResponse aResponse) { System.out.println("onResponse:" + aResponse.getData()); } @Override public void onFailure(ARequest aRequest, AError aError) { System.out.println("onFailure:" + aError.getCode() + aError.getMsg()); } }); }この操作を呼び出すときは、ビジネス要件に基づいてパラメーターを設定する必要があります。
パラメーター
例
説明
request.topic
"/" + productKey + "/" + deviceName + "/user/devmsg"
デバイスが公開権限を持つカスタムトピック。
request.payloadObj
"{\"temperature\":35.0, \"time\":\"sometime\"}"
メッセージの内容。
サーバーは次のメッセージを受信します。
Message {payload={"temperature":35.0, "time":"sometime"}, topic='/a1uzcH0****/device1/user/devmsg', messageId='1131755639450642944', qos=0, generateTime=1558666546105}
サーバーがデバイスにメッセージを送信するように設定する
次の図は、サーバーがデバイスにメッセージを送信する方法を示しています。

デバイス SDK を設定して、カスタムトピックをサブスクライブします。
デバイスを認証するためのパラメーターの設定、接続を初期化するためのパラメーターの設定、および接続の初期化の方法については、「デバイスがサーバーにメッセージを送信するように設定する」のサンプルコードをご参照ください。
カスタムトピックをサブスクライブするようにデバイスを設定する必要があります。
次のサンプルコードは、Topic をサブスクライブするようにデバイスを設定する方法の例を示しています。
// コールバック関数を実装します。 @Override public void onInitDone(InitResult initResult) { // デバイスがサブスクライブする Topic を指定します。 MqttSubscribeRequest request = new MqttSubscribeRequest(); request.topic = "/" + productKey + "/" + deviceName + "/user/cloudmsg"; request.isSubscribe = true; // サブスクリプションリクエストを送信し、サブスクリプションが成功または失敗した後に呼び出されるコールバック関数を設定します。 LinkKit.getInstance().subscribe(request, new IConnectSubscribeListener() { @Override public void onSuccess() { System.out.println(""); } @Override public void onFailure(AError aError) { } }); // ダウンストリームメッセージのリスナーを設定します。 IConnectNotifyListener notifyListener = new IConnectNotifyListener() { // ダウンストリームメッセージが受信された後に使用されるコールバック関数を設定します。 @Override public void onNotify(String connectId, String topic, AMessage aMessage) { System.out.println( "received message from " + topic + ":" + new String((byte[])aMessage.getData())); } @Override public boolean shouldHandle(String s, String s1) { return false; } @Override public void onConnectStateChange(String s, ConnectState connectState) { } }; LinkKit.getInstance().registerOnNotifyListener(notifyListener); }request.topicパラメーターを、デバイスがサブスクライブ権限を持つカスタムトピックに設定する必要があります。クラウド SDK を設定して IoT Platform の Pub 操作を呼び出し、メッセージを公開します。パラメーターの詳細については、「Pub」をご参照ください。Java 用 SDK の使用方法の詳細については、「Java 用 SDK の使用」をご参照ください。
デバイスを認証するためのパラメーターを設定します。
String regionId = "cn-shanghai"; String accessKey = "LTAI****"; String accessSecret = "********"; final String productKey = "a1uzcH0****"; final String deviceName = "device1"; final String iotInstanceId = "iot-2w****";ビジネス要件に基づいてコードを修正し、パラメーターを指定する必要があります。
パラメーター
例
説明
accessKey
LTAI****
Alibaba Cloud アカウントの AccessKey ID と AccessKey Secret。
IoT Platform コンソールにログオンし、プロファイル画像の上にポインターを移動し、[AccessKey 管理] をクリックして AccessKey ID と AccessKey Secret を取得します。
説明RAM ユーザーを使用する場合は、AliyunIOTFullAccess 権限ポリシーを RAM ユーザーにアタッチする必要があります。このポリシーにより、RAM ユーザーは IoT Platform リソースを管理できます。AliyunIOTFullAccess 権限ポリシーを RAM ユーザーにアタッチしないと、IoT Platform への接続は失敗します。RAM ユーザーに権限を付与する方法の詳細については、「RAM ユーザーアクセス」をご参照ください。
accessSecret
********
productKey
a1uzcH0****
デバイス証明書情報。IoT Platform コンソールの [デバイス詳細] ページで情報を表示できます。詳細については、「デバイス詳細の表示」をご参照ください。
deviceName
device1
region
cn-shanghai
IoT Platform デバイスが配置されているリージョンの ID。リージョン ID の詳細については、「リージョンとゾーン」をご参照ください。
iotInstanceId
iot-2w****
デバイスが属するインスタンスの ID。
IoT Platform コンソールの [概要] ページでインスタンス ID を表示できます。
インスタンス ID が表示されている場合は、このパラメーターを指定する必要があります。
インスタンスに [概要] または ID が生成されていない場合は、パラメーターに空の文字列 (
iotInstanceId = "") を指定します。
接続パラメーターを設定します。
//クライアントパラメーターを設定します。 DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKey, accessSecret); IAcsClient client = new DefaultAcsClient(profile);メッセージの公開に使用されるパラメーターを設定します。
PubRequest request = new PubRequest(); request.setIotInstanceId(iotInstanceId); request.setQos(0); // メッセージが公開される Topic を指定します。 request.setTopicFullName("/" + productKey + "/" + deviceName + "/user/cloudmsg"); request.setProductKey(productKey); // MessageContent パラメーターを設定します。メッセージの内容は Base64 でエンコードする必要があります。そうしないと、メッセージの内容が文字化けして表示されます。 request.setMessageContent(Base64.encode("{\"accuracy\":0.001,\"time\":now}"));この操作を呼び出すときは、ビジネス要件に基づいてパラメーターを設定する必要があります。詳細については、「Pub」をご参照ください。
メッセージを公開します。
try { PubResponse response = client.getAcsResponse(request); System.out.println("pub success?:" + response.getSuccess()); } catch (Exception e) { System.out.println(e); }デバイスは次のメッセージを受信します:
msg = [{"accuracy":0.001,"time":now}]
付録: サンプルコード
ビジネス要件に基づいてコードを修正し、パラメーターを指定する必要があります。
Pub/Sub デモをダウンロードします。これには、この例のクラウド SDK とデバイス SDK の設定のサンプルコードが含まれています。
AMQP クライアントを IoT Platform に接続する方法については、次のトピックをご参照ください。