すべてのプロダクト
Search
ドキュメントセンター

IoT Platform:TSL ベースの通信の確立

最終更新日:Sep 05, 2026

Alink プロトコルを介して、デバイスと IoT Platform との間で Thing Specification Language (TSL) ベースの通信を確立できます。デバイスはプロパティやイベントを IoT Platform に送信し、IoT Platform はデバイスにコマンドを送信してプロパティを設定したり、サービスを呼び出したりします。このトピックでは、サンプル Java コードを使用して、TSL ベースの通信を確立する方法について説明します。

前提条件

  • IoT Platform が有効化されていること。
  • Java 開発環境がインストールされていること。

プロダクトとデバイスの作成

プロダクトとデバイスを作成し、プロダクトの TSL 機能を定義する必要があります。

  1. IoT Platform コンソールにログインします。
  2. [概要] ページで、管理するインスタンスを見つけ、インスタンス ID またはインスタンス名をクリックします。

  3. 左側のナビゲーションウィンドウで、[デバイス] > [プロダクト] を選択します。
  4. [プロダクト] ページで、[プロダクトの作成] をクリックします。[プロダクトの作成] ページで、プロダクトのカスタム名を指定し、[カスタムカテゴリ] を選択します。他のパラメーターはデフォルト値を使用し、[OK] をクリックします。
    詳細については、「プロダクトの作成」をご参照ください。
  5. プロダクトの [プロダクト詳細] ページで、[機能定義] をクリックします。[機能定義] タブで、TSL モデルを定義します。

    この例では、次の図に示すように、イベント、サービス、および 2 つのプロパティが [デフォルトモジュール] セクションに追加されます。

    このトピックでは、インポート可能なサンプル TSL モデルを提供しています。TSL モデルのインポート方法の詳細については、「TSL モデルのインポート」をご参照ください。

    TSL-based communication
  6. 左側のナビゲーションウィンドウで、[デバイス] をクリックします。[デバイス] ページで、[デバイスの追加] をクリックしてデバイスを作成します。
    サンプルコードを使用して、デバイスのプロパティをバッチで設定したり、デバイスのサービスをバッチで呼び出したりできます。少なくとも 2 つのデバイスを作成する必要があります。詳細については、「一度に複数のデバイスを作成する」をご参照ください。

SDK デモのダウンロードとインストール

SDK デモには、サーバー側とデバイス側のサンプルコードが含まれています。

  1. iotx-api-demo をクリックして iotx-api-demo パッケージをダウンロードし、パッケージを解凍します。
  2. Java 開発ツールを起動し、解凍した iotx-api-demo フォルダをインポートします。
  3. 次の 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>
  4. 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));
              }
          }

リクエストの例:

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}
  • デバイスの [デバイス詳細] ページで、[デフォルトモジュール] をクリックします。
    • [ステータス] タブには、デバイスが最後に送信したプロパティ値が表示されます。
    • [イベント] タブには、デバイスが最後に送信したイベントが表示されます。
    • [サービスの呼び出し] タブには、サービス呼び出しのレコードが表示されます。