Alink プロトコルを介して、デバイスと IoT Platform との間で Thing Specification Language (TSL) ベースの通信を確立できます。デバイスはプロパティやイベントを IoT Platform に送信し、IoT Platform はデバイスにコマンドを送信してプロパティを設定したり、サービスを呼び出したりします。このトピックでは、サンプル Java コードを使用して、TSL ベースの通信を確立する方法について説明します。
前提条件
- IoT Platform が有効化されていること。
- Java 開発環境がインストールされていること。
プロダクトとデバイスの作成
プロダクトとデバイスを作成し、プロダクトの TSL 機能を定義する必要があります。
- IoT Platform コンソールにログインします。
[概要] ページで、管理するインスタンスを見つけ、インスタンス ID またはインスタンス名をクリックします。
- 左側のナビゲーションウィンドウで、 を選択します。
- [プロダクト] ページで、[プロダクトの作成] をクリックします。[プロダクトの作成] ページで、プロダクトのカスタム名を指定し、[カスタムカテゴリ] を選択します。他のパラメーターはデフォルト値を使用し、[OK] をクリックします。詳細については、「プロダクトの作成」をご参照ください。
- プロダクトの [プロダクト詳細] ページで、[機能定義] をクリックします。[機能定義] タブで、TSL モデルを定義します。
この例では、次の図に示すように、イベント、サービス、および 2 つのプロパティが [デフォルトモジュール] セクションに追加されます。
このトピックでは、インポート可能なサンプル TSL モデルを提供しています。TSL モデルのインポート方法の詳細については、「TSL モデルのインポート」をご参照ください。

- 左側のナビゲーションウィンドウで、[デバイス] をクリックします。[デバイス] ページで、[デバイスの追加] をクリックしてデバイスを作成します。サンプルコードを使用して、デバイスのプロパティをバッチで設定したり、デバイスのサービスをバッチで呼び出したりできます。少なくとも 2 つのデバイスを作成する必要があります。詳細については、「一度に複数のデバイスを作成する」をご参照ください。
SDK デモのダウンロードとインストール
SDK デモには、サーバー側とデバイス側のサンプルコードが含まれています。
- iotx-api-demo をクリックして iotx-api-demo パッケージをダウンロードし、パッケージを解凍します。
- Java 開発ツールを起動し、解凍した iotx-api-demo フォルダをインポートします。
- 次の Maven 依存関係を pom.xml ファイルに追加して、IoT Platform SDK と Link SDK をインポートします。
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-iot --> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-iot</artifactId> <version>7.33.0</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>com.aliyun.alink.linksdk</groupId> <artifactId>iot-linkkit-java</artifactId> <version>1.2.0</version> <scope>compile</scope> </dependency> - java/src/main/resources/ ディレクトリで config ファイルを開き、初期化に必要な情報を指定します。
user.accessKeyID = <ご利用の AccessKey ID> user.accessKeySecret = <ご利用の AccessKey Secret> iot.regionId = <リージョン ID> iot.productCode = Iot iot.domain = iot.<リージョン ID>.aliyuncs.com iot.version = 2018-01-20パラメーター 説明 accessKeyID ご利用の Alibaba Cloud アカウントの AccessKey ID。 AccessKey ペアを作成または表示するには、次の手順を実行します。Alibaba Cloud 管理コンソールにログインします。プロフィール画像の上にポインターを移動し、[AccessKey 管理] をクリックして [AccessKey ペア] ページに移動します。
accessKeySecret ご利用の Alibaba Cloud アカウントの AccessKey Secret。AccessKey ID と同じ方法で AccessKey Secret を取得できます。 regionId ご利用の IoT デバイスが存在するリージョンの ID。リージョン ID の詳細については、「リージョンとゾーン」をご参照ください。
Link SDK を使用したプロパティとイベントの送信
Link SDK を設定して IoT Platform に接続し、プロパティとイベントを送信します。
ThingTemplate ファイル ( java/src/main/com.aliyun.iot.api.common.deviceApi ディレクトリ内) にサンプルコードが含まれています。
- 接続情報を指定します。
サンプルコードの productKey、deviceName、deviceSecret パラメーターの値を、ご利用のデバイス証明書の情報に置き換えます。url パラメーターの値を、ご利用の MQTT エンドポイントに置き換えます。エンドポイントの取得方法の詳細については、「インスタンスエンドポイントの管理」をご参照ください。エンドポイントにはポート 1883 を含める必要があります。
public static void main(String[] args) { /** * デバイス証明書に関する情報。 */ String productKey = "ご利用の productKey"; String deviceName = "ご利用の deviceName"; String deviceSecret = "ご利用の deviceSecret"; /*TODO: 次のエンドポイントを、ご利用のインスタンスのエンドポイントに置き換えてください。 */ String url = "iot-6d***ql.mqtt.iothub.aliyuncs.com:1883"; /** * MQTT 接続に関する情報。 */ ThingTemplate manager = new ThingTemplate(); DeviceInfo deviceInfo = new DeviceInfo(); deviceInfo.productKey = productKey; deviceInfo.deviceName = deviceName; deviceInfo.deviceSecret = deviceSecret; /** * Java HTTP クライアントは TSLv1.2 をサポートしています。 */ System.setProperty("https.protocols", "TLSv2"); manager.init(deviceInfo, url); } - 接続パラメーターを初期化します。
public void init(final DeviceInfo deviceInfo, String url) { LinkKitInitParams params = new LinkKitInitParams(); /** * MQTT 初期化のパラメーターを設定します。 */ IoTMqttClientConfig config = new IoTMqttClientConfig(); config.productKey = deviceInfo.productKey; config.deviceName = deviceInfo.deviceName; config.deviceSecret = deviceInfo.deviceSecret; config.channelHost = url; /** * オフラインメッセージを受信するかどうかを指定します。 * MQTT 接続に対応する cleanSession フィールド。 */ config.receiveOfflineMsg = false; params.mqttClientConfig = config; ALog.setLevel(LEVEL_DEBUG); ALog.i(TAG, "mqtt connetcion info=" + params); /** * 初期化パラメーターを設定し、デバイスの証明書情報を指定します。 */ params.deviceInfo = deviceInfo; /** 接続を確立します。**/ LinkKit.getInstance().init(params, new ILinkKitConnectListener() { public void onError(AError aError) { ALog.e(TAG, "Init Error error=" + aError); } public void onInitDone(InitResult initResult) { ALog.i(TAG, "onInitDone result=" + initResult); List<Property> properties = LinkKit.getInstance().getDeviceThing().getProperties(); ALog.i(TAG, "デバイスのプロパティ" + JSON.toJSONString(properties)); List<Event> getEvents = LinkKit.getInstance().getDeviceThing().getEvents(); ALog.i(TAG, "デバイスイベントのリスト" + JSON.toJSONString(getEvents)); /* プロパティを送信します。TODO: 送信するプロパティがプロダクトの TSL モデルで定義されていることを確認してください。例: MicSwitch。そうでない場合、エラーメッセージが返されます。*/ handlePropertySet("MicSwitch", new ValueWrapper.IntValueWrapper(1)); /* イベントを送信します。TODO: 送信するイベントがプロダクトの TSL モデルで定義されていることを確認してください。例: Offline_alarm。そうでない場合、エラーメッセージが返されます。*/ Map<String,ValueWrapper> values = new HashMap<>(); values.put("eventValue",new ValueWrapper.IntValueWrapper(0)); OutputParams outputParams = new OutputParams(values); handleEventSet("Offline_alarm",outputParams); } }); }説明 コード内のプロパティとイベントの識別子は、TSL モデルで定義されている識別子と同じである必要があります。 - Link SDK を設定してプロパティを送信します。
/** * デバイスは Alink JSON 形式でプロパティを送信します。 * @param identifier: プロパティの識別子。 * @param value: プロパティの値。 * @return */ private void handlePropertySet(String identifier, ValueWrapper value ) { ALog.i(TAG, "Identifier of the property=" + identifier); Map<String, ValueWrapper> reportData = new HashMap<>(); reportData.put(identifier, value); LinkKit.getInstance().getDeviceThing().thingPropertyPost(reportData, new IPublishResourceListener() { public void onSuccess(String s, Object o) { // プロパティが送信されました。 ALog.i(TAG, "Submitted. onSuccess() called with: s = [" + s + "], o = [" + o + "]"); } public void onError(String s, AError aError) { // プロパティ値の送信に失敗しました。 ALog.i(TAG, "Failed to submit. onError() called with: s = [" + s + "], aError = [" + JSON.toJSONString(aError) + "]"); } }); } - Link SDK を設定してイベントを送信します。
/** * デバイスは Alink JSON 形式でイベントを送信します。 * @param identifier: イベントの識別子。 * @param params: イベントのパラメーター。 * @return */ private void handleEventSet(String identifyID, OutputParams params ) { ALog.i(TAG, "Identifier of the event=" + identifyID + " params=" + JSON.toJSONString(params)); LinkKit.getInstance().getDeviceThing().thingEventPost( identifyID, params, new IPublishResourceListener() { public void onSuccess(String s, Object o) { // イベントが送信されました。 ALog.i(TAG, "Submitted. onSuccess() called with: s = [" + s + "], o = [" + o + "]"); } public void onError(String s, AError aError) { // イベントの送信に失敗しました。 ALog.i(TAG, "Failed to submit. onError() called with: s = [" + s + "], aError = [" + JSON.toJSONString(aError) + "]"); } }); }
IoT Platform SDK を使用したプロパティ設定コマンドの送信とサービスの呼び出し
- クライアントを初期化します。
IotClient ファイル ( java/src/main/com.aliyun.iot.client ディレクトリ内) にサンプルコードが含まれています。
public class IotClient { private static String accessKeyID; private static String accessKeySecret; private static String regionId; private static String domain; private static String version; public static DefaultAcsClient getClient() { DefaultAcsClient client = null; Properties prop = new Properties(); try { prop.load(Object.class.getResourceAsStream("/config.properties")); accessKeyID = prop.getProperty("user.accessKeyID"); accessKeySecret = prop.getProperty("user.accessKeySecret"); regionId = prop.getProperty("iot.regionId"); domain = prop.getProperty("iot.domain"); version = prop.getProperty("iot.version"); IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyID, accessKeySecret); DefaultProfile.addEndpoint(regionId, regionId, prop.getProperty("iot.productCode"), prop.getProperty("iot.domain")); // クライアントを初期化します。 client = new DefaultAcsClient(profile); } catch (Exception e) { LogUtil.print("Failed to initialize the client. exception:" + e.getMessage()); } return client; } public static String getRegionId() { return regionId; } public static void setRegionId(String regionId) { IotClient.regionId = regionId; } public static String getDomain() { return domain; } public static void setDomain(String domain) { IotClient.domain = domain; } public static String getVersion() { return version; } public static void setVersion(String version) { IotClient.version = version; } } - CommonRequest パブリッククラスを初期化します。
AbstractManager ファイル ( java/src/main/com.aliyun.iot.api.common.openApi ディレクトリ内) は、CommonRequest パブリッククラスをカプセル化します。
public class AbstractManager { private static DefaultAcsClient client; static { client = IotClient.getClient(); } /** * CommonRequest クラスを初期化します。action: API オペレーションの名前。 * domain: エンドポイント。 * version: API バージョン。 */ public static CommonRequest executeTests(String action) { CommonRequest request = new CommonRequest(); request.setDomain(IotClient.getDomain()); request.setMethod(MethodType.POST); request.setVersion(IotClient.getVersion()); request.setAction(action); return request; } - IoT Platform の API オペレーションを呼び出して、プロパティを設定し、サービスを呼び出します。
ThingManagerForPopSDk ファイル ( java/src/main/com.aliyun.iot.api.common.openApi ディレクトリ内) にサンプルコードが含まれています。
- SetDeviceProperty オペレーションを呼び出して、デバイスのプロパティを設定します。
public static void SetDeviceProperty(String InstanceId, String IotId, String ProductKey, String DeviceName , String Items) { SetDevicePropertyResponse response =null; SetDevicePropertyRequest request=new SetDevicePropertyRequest(); request.setDeviceName(DeviceName); request.setIotId(IotId); request.setItems(Items); request.setProductKey(ProductKey); request.setIotInstanceId(InstanceId); try { response = client.getAcsResponse(request); if (response.getSuccess() != null && response.getSuccess()) { LogUtil.print("デバイスのプロパティが設定されました。"); LogUtil.print(JSON.toJSONString(response)); } else { LogUtil.print("デバイスのプロパティの設定に失敗しました。"); LogUtil.error(JSON.toJSONString(response)); } } catch (ClientException e) { e.printStackTrace(); LogUtil.error("デバイスのプロパティの設定に失敗しました。" + JSON.toJSONString(response)); } } - SetDevicesProperty オペレーションを呼び出して、デバイスのプロパティをバッチで設定します。
/** * デバイスのプロパティをバッチで設定します。 * * @param ProductKey: プロパティを設定するデバイスが属するプロダクトの ProductKey。 * @param DeviceNames: プロパティを設定するデバイスの DeviceName。 * @param Items: 複数のキーと値のペアからなる JSON 文字列で構成されるプロパティ情報。このパラメーターは必須です。 * * @Des: 説明。 */ public static void SetDevicesProperty(String InstanceId, String ProductKey, List<String> DeviceNames, String Items) { SetDevicesPropertyResponse response = new SetDevicesPropertyResponse(); SetDevicesPropertyRequest request = new SetDevicesPropertyRequest(); request.setDeviceNames(DeviceNames); request.setItems(Items); request.setProductKey(ProductKey); request.setIotInstanceId(InstanceId); try { response = client.getAcsResponse(request); if (response.getSuccess() != null && response.getSuccess()) { LogUtil.print("プロパティがバッチで設定されました。"); LogUtil.print(JSON.toJSONString(response)); } else { LogUtil.print("デバイスのプロパティのバッチ設定に失敗しました。"); LogUtil.error(JSON.toJSONString(response)); } } catch (ClientException e) { e.printStackTrace(); LogUtil.error("デバイスのプロパティのバッチ設定に失敗しました。" + JSON.toJSONString(response)); } } - InvokeThingService オペレーションを呼び出して、デバイスのサービスを呼び出します。
/** * @param Identifier: サービスの識別子。このパラメーターは必須です。 * @param Args: サービスを開始するために必要な入力パラメーター。このパラメーターは必須です。 */ public static InvokeThingServiceResponse.Data InvokeThingService(String InstanceId, String IotId, String ProductKey, String DeviceName, String Identifier, String Args) { InvokeThingServiceResponse response =null; InvokeThingServiceRequest request = new InvokeThingServiceRequest(); request.setArgs(Args); request.setDeviceName(DeviceName); request.setIotId(IotId); request.setIdentifier(Identifier); request.setProductKey(ProductKey); request.setIotInstanceId(InstanceId); try { response = client.getAcsResponse(request); if (response.getSuccess() != null && response.getSuccess()) { LogUtil.print("サービスが実行されました。"); LogUtil.print(JSON.toJSONString(response)); } else { LogUtil.print("サービスの実行に失敗しました。"); LogUtil.error(JSON.toJSONString(response)); } return response.getData(); } catch (ClientException e) { e.printStackTrace(); LogUtil.error("サービスの実行に失敗しました。" + JSON.toJSONString(response)); } return null; }説明 サービスを同期的に呼び出す場合は、TSL モデルを定義する際に [呼び出しメソッド] パラメーターを [同期] に設定します。デバイスを開発する際には、同期サービスの呼び出しを処理するコードを記述する必要があります。 - InvokeThingsService オペレーションを呼び出して、デバイスのサービスをバッチで呼び出します。
/** * @param Identifier: サービスの識別子。このパラメーターは必須です。 * @param Args: サービスを開始するために必要な入力パラメーター。このパラメーターは必須です。 */ public static void InvokeThingsService(String InstanceId, String IotId, String ProductKey, List<String> DeviceNames, String Identifier, String Args) { InvokeThingsServiceResponse response =null; InvokeThingsServiceRequest request = new InvokeThingsServiceRequest(); request.setArgs(Args); request.setIdentifier(Identifier); request.setDeviceNames(DeviceNames); request.setProductKey(ProductKey); request.setIotInstanceId(InstanceId); try { response = client.getAcsResponse(request); if (response.getSuccess() != null && response.getSuccess()) { LogUtil.print("サービスが呼び出されました。"); LogUtil.print(JSON.toJSONString(response)); } else { LogUtil.print("サービスのバッチ呼び出しに失敗しました。"); LogUtil.error(JSON.toJSONString(response)); } } catch (ClientException e) { e.printStackTrace(); LogUtil.error("サービスのバッチ呼び出しに失敗しました。" + JSON.toJSONString(response)); } }
- SetDeviceProperty オペレーションを呼び出して、デバイスのプロパティを設定します。
リクエストの例:
public static void main(String[] args) {
/** オンラインデバイスの DeviceName と、そのデバイスが属するプロダクトの Productkey。*/
String deviceName = "2pxuAQB2I7wGPmqq***";
String deviceProductkey = "a1QbjI2***";
/** Enterprise Edition インスタンスまたは新バージョンのパブリックインスタンスを使用する場合は、InstanceId パラメーターにインスタンス ID を指定します。インスタンス ID を取得するには、IoT Platform コンソールにログインし、[概要] ページでインスタンス ID を表示します。
* 旧バージョンのパブリックインスタンスを使用する場合は、InstanceId パラメーターを空の "" のままにします。
*/
String InstanceId = "iot-***tl02";
//1. デバイスのプロパティを設定します。
SetDeviceProperty(InstanceId, null, deviceProductkey, deviceName,"{\"hue\":0}");
//2. デバイスのプロパティをバッチで設定します。
List<String> deviceNames = new ArrayList<>();
deviceNames.add(deviceName);
SetDevicesProperty(InstanceId, deviceProductkey, deviceNames, "{\"hue\":0}");
//3. デバイスのサービスを呼び出します。
InvokeThingService(InstanceId, null, deviceProductkey, deviceName, "ModifyVehicleInfo", "{}");
//4. デバイスのサービスをバッチで呼び出します。
List<String> deviceNamesService = new ArrayList<>();
deviceNamesService.add(deviceName);
InvokeThingsService(null, deviceProductkey, deviceNamesService, "ModifyVehicleInfo", "{}");
}SDK のデバッグ
Link SDK と IoT Platform SDK の設定後、SDK を実行します。
結果の確認:
- ローカルログを表示します。
2022-04-08 05:29:41.165 - [ThingManagerForPopSDk.java] - SetDeviceProperty(35):デバイスのプロパティが設定されました。 2022-04-08 05:29:41.250 - [ThingManagerForPopSDk.java] - SetDeviceProperty(36):{"code":"","data":{"messageId":"1703383434"},"requestId":"049ED108-B2BB-50F5-8D70-FD3158AF794E","success":true} 2022-04-08 05:29:41.671 - [ThingManagerForPopSDk.java] - SetDevicesProperty(69):プロパティがバッチで設定されました。 2022-04-08 05:29:41.675 - [ThingManagerForPopSDk.java] - SetDevicesProperty(70):{"code":"","requestId":"31B3D707-71E8-5F18-A8E8-349CB92C013F","success":true} 2022-04-08 05:29:41.777 - [ThingManagerForPopSDk.java] - InvokeThingService(107):サービスが実行されました。 2022-04-08 05:29:41.784 - [ThingManagerForPopSDk.java] - InvokeThingService(108):{"code":"","data":{"messageId":"1708568778"},"requestId":"63995E46-FE04-5F84-AF40-8F11873B253B","success":true} 2022-04-08 05:29:41.851 - [ThingManagerForPopSDk.java] - InvokeThingsService(148):サービスが呼び出されました。 2022-04-08 05:29:41.854 - [ThingManagerForPopSDk.java] - InvokeThingsService(149):{"code":"","requestId":"A9BE6716-B1F5-5916-8DBA-1D17CB651659","success":true} - デバイスの [デバイス詳細] ページで、[デフォルトモジュール] をクリックします。
- [ステータス] タブには、デバイスが最後に送信したプロパティ値が表示されます。
- [イベント] タブには、デバイスが最後に送信したイベントが表示されます。
- [サービスの呼び出し] タブには、サービス呼び出しのレコードが表示されます。