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

IoT Platform:ゲートウェイとサブデバイス

最終更新日:Mar 22, 2025

サブデバイス管理機能を使用して、ゲートウェイのサブデバイスを IoT Platform に接続できます。 このトピックでは、ゲートウェイとそのサブデバイスを構成および開発し、サブデバイスを IoT Platform に接続する方法について説明します。

機能

ゲートウェイのサブデバイスを管理するために、次の操作を実行できます。サブデバイスの動的登録、サブデバイスの追加と削除、IoT Platform からのゲートウェイ配下のすべてのサブデバイスのクエリ、IoT Platform へのサブデバイスの接続と切断、サブデバイスの無効化と削除に関するメッセージのリッスン。 また、ゲートウェイを使用して、サブデバイスの代わりに IoT Platform と通信することもできます。 ゲートウェイは、IoT Platform に直接接続できるデバイスであり、上記のすべての機能を直接使用できます。 サブデバイスを IoT Platform に接続する前に、ゲートウェイとそのサブデバイス間の接続とデータ通信チャネルを構成する必要があります。

開発

ゲートウェイ開発

  • IoT Platform コンソールでゲートウェイプロダクトを作成するには、次の操作を実行できます。[ノードタイプ] パラメーターを [ゲートウェイデバイス] に設定し、ゲートウェイの認証モードを選択し、ゲートウェイの機能に基づいてトピックを指定するか、TSL(Thing Specification Language)モデルを定義します。 また、以前のトピックに基づいてゲートウェイの機能を開発することもできます。

  • 次のサブデバイス管理機能がサポートされています。

    1. ゲートウェイがサブデバイスを検出し、接続します。

      Alibaba Cloud は、サブデバイスを検出してゲートウェイに接続するためのサンプルコードを提供していません。独自のコードを作成する必要があります。

    2. ゲートウェイがサブデバイスの証明書を取得します。

      詳細については、このトピックの「サブデバイスの証明書を取得する」セクションをご参照ください。

    3. IoT Platform がゲートウェイのサブデバイスを管理します。

      ゲートウェイがサブデバイスを検出して接続すると、関連する SDK API を呼び出してサブデバイスを追加する必要があります。 ゲートウェイはサブデバイスの証明書情報を取得し、関連する SDK API を呼び出してサブデバイスを IoT Platform に接続します。

      説明

      IoT Platform が切断されたサブデバイスを管理しようとすると、失敗の結果がすぐに返されます。 IoT Platform からの下流コマンドに対してゲートウェイから返されるエラーメッセージまたはタイムアウトメッセージを待つ必要はありません。

    4. ゲートウェイがサブデバイスのステータスを IoT Platform コンソールに同期します。

      • ゲートウェイがサブデバイスが接続されていることを IoT Platform に通知した後、ゲートウェイはサブデバイスのステータスを IoT Platform に送信する必要があります。 これにより、実際のサブデバイスステータスが IoT Platform コンソールで同期されます。

        説明

        TSL モデルでサブデバイスの機能を定義し、サブデバイスがゲートウェイに接続する場合、ゲートウェイはサブデバイスの最新の property 値を IoT Platform に送信する必要があります。

      • サブデバイスがゲートウェイと IoT Platform から切断された場合、ゲートウェイは関連する SDK API を呼び出して、サブデバイスが切断されたことを IoT Platform に通知する必要があります。

      • 接続されているサブデバイスの property 値が変更された場合、ゲートウェイはできるだけ早く最新の property 値を IoT Platform に送信する必要があります。

      • ネットワークの中断またはゲートウェイの再起動により、ゲートウェイが IoT Platform から切断され、その後再接続する場合、ゲートウェイは関連する SDK API を呼び出してすべてのサブデバイスを追加し、サブデバイスが再び接続されたことを IoT Platform に通知する必要があります。 ゲートウェイが再接続される前後にサブデバイスの property 値が変更されないことを保証できない場合、ゲートウェイはサブデバイスの最新の property 値を IoT Platform に送信する必要があります。

    5. サブデバイスが IoT Platform から送信されたメッセージを受信します。

      ゲートウェイが IoT Platform からサブデバイスに送信されたコマンドを受信すると、ゲートウェイはデータをサブデバイスでサポートされている形式に変換する必要があります。 Alibaba Cloud はサンプルコードを提供していません。 カスタムメソッドを使用してデータ変換機能を開発できます。

サブデバイス開発

  • デバイスメーカーが IoT Platform コンソールでサブデバイスタイプを定義する場合、次の操作を実行できます。[ノードタイプ] パラメーターを [ゲートウェイサブデバイス] に設定し、プロダクトの認証モードを選択します。

  • Alibaba Cloud は、サブデバイス用の SDK を提供していません。 デバイスメーカーは、サブデバイスの管理に使用するプロトコルについて、ゲートウェイメーカーと合意する必要があります。 次のサブデバイス管理操作が含まれます。ゲートウェイがサブデバイスを検出する、ゲートウェイがサブデバイスに接続する、サブデバイスがゲートウェイから切断する、ゲートウェイが IoT Platform からサブデバイスにコマンドを送信する。

ゲートウェイを使用してサブデバイスを検証し IoT Platform に接続する

サブデバイスの証明書を取得する

サブデバイスを IoT Platform に接続する前に、ゲートウェイを使用してサブデバイスを IoT Platform に登録する必要があります。 サブデバイスの登録中にデバイス検証を行うには、サブデバイスの証明書が必要です。 ゲートウェイは、ビジネス要件に基づいて、次のいずれかの方法を使用してサブデバイス証明書を取得できます。

  • サブデバイスから証明書を取得する

    ゲートウェイとサブデバイス間でプロトコルが定義されています。 ゲートウェイがサブデバイスを検出して接続した後、ゲートウェイはサブデバイス証明書を取得します。 Alibaba Cloud はプロトコルを提供していません。 ゲートウェイメーカーとサブデバイスメーカーは、カスタムプロトコルを定義および実装できます。

  • サブデバイス証明書をプリセットする

    この方法は、次の条件が満たされる場合に使用できます。ゲートウェイは接続プロセスが開始される前にサブデバイスの情報を取得でき、ゲートウェイでサブデバイス証明書を構成できます。 この機能は、ゲートウェイメーカーによって実装される必要があります。

  • 動的登録中にサブデバイス証明書を取得する

    ゲートウェイは、プロトコルを使用してサブデバイスを検出して接続し、サブデバイスのモデル(model パラメーター)と一意の識別子(SNMAC アドレスなど)を取得できます。 ゲートウェイがサブデバイスの DeviceSecret を取得できない場合は、次の手順を実行します。

    1. IoT Platform コンソールでサブデバイスのプロダクトを追加します。 IoT Platform は、サブデバイスの ProductKey を生成します。

    2. ゲートウェイを使用して、サブデバイスモデル(model パラメーター)と IoT Platform コンソールで生成された ProductKey をマッピングし、IoT Platform コンソールで DeviceName パラメーターをデバイスの一意の識別子に設定します。 ゲートウェイメーカーは、ゲートウェイ上でサブデバイスモデルと ProductKey 間のマッピングを実装します。

    3. ゲートウェイは、IoT Platform の動的登録機能を使用して、IoT Platform からサブデバイスの DeviceSecret を取得します。 これにより、ゲートウェイは完全なサブデバイス証明書を取得します。

ゲートウェイを有効にする

ゲートウェイを初期化するときは、enableGateway オプションを true に設定します。 詳細については、「デバイスを検証して接続する」トピックの「デバイスごとの一意の証明書検証」セクションにある ioTDMConfig.enableGateway オプションの説明をご参照ください。

// デフォルトでは、ゲートウェイは無効になっています。 ゲートウェイが有効になると、ゲートウェイモジュールが初期化され、IoT Platform からゲートウェイモジュールのサブデバイスリストが取得されます。
ioTDMConfig.enableGateway = true;

サブデバイスを動的に登録する

ProductKey と DeviceName を使用してサブデバイスを動的に登録する

ゲートウェイにサブデバイスを追加するには、動的登録を実行してサブデバイス証明書を取得する必要があります。 IoT Platform コンソールで動的登録機能が有効になっていることを確認してください。 複数のサブデバイスを動的に登録し、すべてのサブデバイス証明書を取得できます。

説明

必要なサブデバイス証明書がオンプレミスで利用可能な場合は、この手順をスキップします。 サブデバイスが別のゲートウェイにバインドされている場合、動的登録リクエストに対してサブデバイス証明書は返されません。

LinkKit.getInstance().getGateway().gatewaySubDevicRegister(getSubDevList(), new IConnectSendListener() {
    @Override
    public void onResponse(ARequest aRequest, AResponse aResponse) {
        ALog.d(TAG, "onResponse() called with: aRequest = [" + aRequest + "], aResponse = [" + (aResponse == null ? "null" : aResponse.data) + "]");
        try {
            // サブデバイスの動的登録が成功しました。
            ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() {
            }.getType());
            // レスポンスは、動的登録が成功したかどうかを示します。 たとえば、HTTP ステータスコード 200 は、動的登録が成功したことを示します。
            // サブデバイス証明書を保存します。
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onFailure(ARequest aRequest, AError aError) {
        // サブデバイスの動的登録に失敗しました。
    }
});
            

ProductKey、DeviceName、ProductSecret を使用してサブデバイスを動的に登録するProductKey、DeviceName、および ProductSecret

サブデバイスの ProductKeyDeviceNameProductSecret を取得し、先行動的登録を実行する必要がある場合は、この方法を使用してサブデバイスを動的に登録できます。 先行動的登録を実行すると、サブデバイスが別のゲートウェイにバインドされている場合でも、サブデバイス証明書が返されます。

説明
  • この動的登録方法を使用するには、サブデバイスの ProductSecret を取得する必要があります。 この方法は、前の動的登録方法よりも安全性が低くなります。

  • COTA(Configuration Over-The-Air)を使用して、サブデバイスの ProductKeyDeviceNameProductSecret をゲートウェイに配信し、先行動的登録を実行することをお勧めします。

シナリオ

この方法は、サブデバイスをゲートウェイ A からバインド解除し、次にサブデバイスをゲートウェイ B にバインドする必要がある場合に適用できます。

サンプルコード

// この動的登録方法では、事前にサブデバイスの ProductSecret を取得する必要があります。 したがって、この方法は、ProductKey と DeviceName を使用する動的登録方法よりも安全性が低くなります。
// この動的登録方法は、COTA と組み合わせて使用​​して、IoT Platform からサブデバイスの ProductKey、DeviceName、ProductSecret を配信できます。
// ゲートウェイが ProductKey、DeviceName、ProductSecret を受信した後、動的登録が完了します。
// このサンプルコードは、サブデバイスがバインドされているゲートウェイを変更する場合に使用できます。
MqttPublishRequest request = new MqttPublishRequest();
final RequestModel requestModel = new RequestModel();
requestModel.id = String.valueOf(IDGenerater.generateId());
requestModel.version = "1.0";
requestModel.method = GatewayChannel.METHOD_PRESET_SUBDEV_REGITER;
request.isRPC = true;
JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < presetSubdevList.size(); i++) {
    DeviceInfo itemDev = presetSubdevList.get(i);
    Map<String, String> itemMap = new HashMap<>();
    itemMap.put("productKey", itemDev.productKey);
    itemMap.put("deviceName", itemDev.deviceName);
    itemMap.put("random", RandomStringUtil.getRandomString(10));
    String sign = SignUtils.hmacSign(itemMap, itemDev.productSecret);
    itemMap.put("sign", sign);
    itemMap.put("signMethod", "hmacsha1");
    jsonArray.add(itemMap);
}
jsonObject.put("proxieds", jsonArray);
requestModel.params = jsonObject;
request.payloadObj = requestModel.toString();
LinkKit.getInstance().getGateway().subDevicRegister(request, new IConnectSendListener() {
    @Override
    public void onResponse(ARequest aRequest, AResponse aResponse) {
        ALog.d(TAG, "onResponse() called with: aRequest = [" + aRequest + "], aResponse = [" + aResponse + "]");
        try {
            showToast("サブデバイスの動的登録結果を受信しました。");
            ResponseModel<Map<String, List<DeviceInfo>>> responseModel = JSONObject.parseObject(aResponse.data.toString(),
                                                                                                new TypeReference<ResponseModel<Map<String, List<DeviceInfo>>>>() {
                                                                                                }.getType());
            // サブデバイスの証明書情報を保存します。
            ALog.d(TAG, "onResponse responseModel=" + JSONObject.toJSONString(responseModel));
            // {"code":200,"data":{"failures":[],"successes":[{"deviceSecret":"xxx","productKey":"xxx","deviceName":"xxx"}]},"id":"1","message":"success","method":"thing.proxy.provisioning.product_register","version":"1.0"}
            // 登録されているサブデバイスのリスト。
            List<DeviceInfo> successList = responseModel.data.get("successes");
            // 登録に失敗したサブデバイスのリスト。
            List<DeviceInfo> failList = responseModel.data.get("failures");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onFailure(ARequest aRequest, AError aError) {
        ALog.d(TAG, "onFailure() called with: aRequest = [" + aRequest + "], aError = [" + aError + "]");
    }
});
            

ゲートウェイを使用してサブデバイスを IoT Platform に接続する

サブデバイスをクエリする

次のサンプルコードは、IoT Platform に追加されたサブデバイスを取得する方法を示しています。

LinkKit.getInstance().getGateway().gatewayGetSubDevices(new IConnectSendListener() {
    @Override
    public void onResponse(ARequest aRequest, AResponse aResponse) {
        // 返されたサブデバイス。
        try {
            ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() {
            }.getType());
            // ビジネス要件に基づいてサブデバイスを管理します。
        } catch (Exception e) {
            e.printStackTrace();
        }
}
    @Override
    public void onFailure(ARequest aRequest, AError aError) {
        // サブデバイスのクエリに失敗しました。
    }
});
            

サブデバイスを追加する

次のサンプルコードは、サブデバイス証明書を取得した後に、ゲートウェイとサブデバイス間のトポロジ関係を追加する方法を示しています。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey=productKey; // 必須の証明書情報。 サブデバイスが属するプロダクトの ProductKey。
deviceInfo.deviceName=deviceName; // 必須の証明書情報。 サブデバイスの DeviceName。
LinkKit.getInstance().getGateway().gatewayAddSubDevice(deviceinfo, new ISubDeviceConnectListener() {
    @Override
    public String getSignMethod() {
        // リクエストの署名に使用する署名方法。
        return "hmacsha1";
    }
    @Override
    public String getSignValue() {
        // DeviceSecret に基づいて署名を生成します。
        Map<String, String> signMap = new HashMap<>();
        signMap.put("productKey", info.productKey);
        signMap.put("deviceName", info.deviceName);
//                signMap.put("timestamp", String.valueOf(System.currentTimeMillis()));
        signMap.put("clientId", getClientId());
        return SignUtils.hmacSign(signMap, info.deviceSecret);
    }
    @Override
    public String getClientId() {
        // clientId パラメーターは固定値にのみ設定できます。
        return "id";
    }
    @Override
    public void onConnectResult(boolean isSuccess, ISubDeviceChannel iSubDeviceChannel, AError aError) {
        // サブデバイスとゲートウェイ間のトポロジ関係を追加するための操作の結果を処理します。
        if (isSuccess) {
            // トポロジ関係が追加された後、ゲートウェイを使用してサブデバイスを IoT Platform に接続できます。
            // subDevOnline(null);
        }
    }
    @Override
    public void onDataPush(String s, AMessage message) {
        // サブデバイスに関する下流データを受信しました: topic=" + s  + ", data=" + message.
        // 下流データがサブデバイスの無効化、削除、追加、またはサービスの呼び出しに関するものである場合、返される message.data は byte[] です。
    }
});
            

サブデバイスを削除する

次のサンプルコードは、ゲートウェイからサブデバイスを削除する方法を示しています。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 必須。 サブデバイスが属するプロダクトの ProductKey。
deviceInfo.deviceName = deviceName; // 必須。 サブデバイスの DeviceName。
LinkKit.getInstance().getGateway().gatewayDeleteSubDevice(deviceinfo, new ISubDeviceRemoveListener() {
    @Override
    public void onSuceess() {
        // サブデバイスが削除されました。
    }
    @Override
    public void onFailed(AError aError) {
        // サブデバイスの削除に失敗しました。
    }
});
            

サブデバイスを接続する

重要

gatewaySubDeviceLogin 操作を呼び出してサブデバイスを IoT Platform に接続する前に、サブデバイスをゲートウェイにバインドしていることを確認してください。

API 操作は非同期的に呼び出されます。 したがって、gatewaySubDeviceLogin 操作を gatewayAddSubDevice 操作の次の行に配置することはできません。 gatewaySubDeviceLogin 操作は、サブデバイスが追加されたことを示すコールバックで呼び出す必要があります。

次のサンプルコードは、サブデバイスがゲートウェイに接続された後に、サブデバイスを IoT Platform に接続する方法を示しています。 サブデバイスが IoT Platform に接続されると、メッセージのサブスクリプションや公開など、IoT Platform コンソールでサブデバイスを管理できます。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 必須。 サブデバイスが属するプロダクトの ProductKey。
deviceInfo.deviceName = deviceName; // 必須。 サブデバイスの DeviceName。
LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(deviceinfo, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        // サブデバイスが IoT Platform に接続されました。
        // サブデバイスが IoT Platform に接続されると、サブデバイスは IoT Platform からの通知(サブデバイスの無効化または削除に関する通知など)をサブスクライブできます。
        // subDevDisable(null);
        // subDevDelete(null);
    }
    @Override
    public void onFailed(AError aError) {
        ALog.d(TAG, "onFailed() called with: aError = [" + aError + "]");
    }
});
            

IoT Platform からサブデバイスを切断する

サブデバイスが IoT Platform から切断された後、ゲートウェイは、IoT Platform がサブデバイスにデータを送信しないように、サブデバイスが切断されたことを IoT Platform に通知する必要があります。 サブデバイスが IoT Platform から切断されると、サブデバイスにメッセージを公開したり、サブデバイスがメッセージをサブスクライブまたはサブスクライブ解除するように構成したりすることはできません。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 必須。 サブデバイスが属するプロダクトの ProductKey。
deviceInfo.deviceName = deviceName; // 必須。 サブデバイスの DeviceName。
LinkKit.getInstance().getGateway().gatewaySubDeviceLogout(deviceinfo, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        // サブデバイスが IoT Platform から切断されました。
    }
    @Override
    public void onFailed(AError aError) {
        // サブデバイスを IoT Platform から切断できませんでした。
    }
});
            

サブデバイスの無効化をリッスンする

ゲートウェイを使用して、IoT Platform コンソールでサブデバイスを管理できます。 たとえば、サブデバイスを有効化、無効化、または削除したり、サブデバイスとゲートウェイ間のトポロジ関係を削除したりできます。

IoT Platform は、サブデバイスの無効化に関する下流通知のみを生成します。 IoT Platform コンソールでサブデバイスが無効になると、サブデバイスは切断されます。 その後、ゲートウェイは、サブデバイスが IoT Platform と通信するためのプロキシとして機能できなくなります。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 必須。 サブデバイスが属するプロダクトの ProductKey。
deviceInfo.deviceName = deviceName; // 必須。 サブデバイスの DeviceName。
LinkKit.getInstance().getGateway().gatewaySetSubDeviceDisableListener(deviceinfo, new IConnectRrpcListener() {
    @Override
    public void onSubscribeSuccess(ARequest aRequest) {
        // 通知のサブスクリプションが成功しました。
    }
    @Override
    public void onSubscribeFailed(ARequest aRequest, AError aError) {
        // 通知のサブスクリプションに失敗しました。
    }
    @Override
    public void onReceived(ARequest aRequest, IConnectRrpcHandle iConnectRrpcHandle) {
        // サブデバイスの無効化に関する通知。
        iConnectRrpcHandle.onRrpcResponse(null, null);
    }
    @Override
    public void onResponseSuccess(ARequest aRequest) {
        Log.d(TAG, "onResponseSuccess() called with: aRequest = [" + aRequest + "]");
    }
    @Override
    public void onResponseFailed(ARequest aRequest, AError aError) {
        Log.d(TAG, "onResponseFailed() called with: aRequest = [" + aRequest + "], aError = [" + aError + "]");
    }
});
            

ゲートウェイを使用してサブデバイスと IoT Platform 間の通信を実装する

TSL ベースの通信を確立する

  • サブデバイスの TSL モデルを初期化する

    initSubDeviceThing 操作は、サブデバイスがゲートウェイに追加され、IoT Platform に接続された後にのみ呼び出すことができます。

    重要

    API 操作は非同期的に呼び出されます。 したがって、initSubDeviceThing 操作を gatewaySubDeviceLogin 操作の次の行に配置することはできません。 initSubDeviceThing 操作は、サブデバイスが IoT Platform に接続されたことを示すコールバックで呼び出す必要があります。

    DeviceInfo deviceInfo = new DeviceInfo();
    deviceInfo.productKey = productKey;
    deviceInfo.deviceName = deviceName;
    //        deviceInfo.deviceSecret = "xxxx";
    Map<String, ValueWrapper> subDevInitState = new HashMap<>();
    //        subDevInitState.put(); // ビジネス要件に基づいてパラメーターを構成します。
    String tsl = null;// ビジネス要件に基づいてパラメーターを構成します。 デフォルトでは、このパラメーターは空のままです。これは、最新の TSL モデルが IoT Platform から取得されることを示します。
    LinkKit.getInstance().getGateway().initSubDeviceThing(tsl, deviceInfo, subDevInitState, new IDMCallback<InitResult>() {
        @Override
        public void onSuccess(InitResult initResult) {
            // TSL モデルが初期化された後、サービス登録やデータ送信などの操作を実行できます。
        }
        @Override
        public void onFailure(AError aError) {
            // サブデバイスの初期化に失敗しました。
        }
    });
                
  • サブデバイスの TSL モデルを使用するための API 操作は、直接接続されたデバイスの TSL モデルを使用するための API 操作と同じです。 次のサンプルコードは、IThing インスタンスを取得する方法を示しています。

    // IThing インスタンスを取得します。
    IThing thing = LinkKit.getInstance().getGateway().getSubDeviceThing(mBaseInfo).first;
    // thing パラメーターは空の場合があります。たとえば、サブデバイスが IoT Platform にログオンしていない場合、TSL モデルが初期化されていない場合、サブデバイスがゲートウェイに追加されていない場合、またはサブデバイスが切断されている場合などです。
    // エラーメッセージは LinkKit.getInstance().getGateway().getSubDeviceThing(mBaseInfo).second に返されます。
    // 関数が空の値を返すかどうかを確認します。
    thing.thingPropertyPost(reportData, new IPublishResourceListener() {
        @Override
        public void onSuccess(String s, Object o) {
            // サブデバイスのステータスが送信されました。
        }
        @Override
        public void onError(String s, AError aError) {
            // サブデバイスのステータスを送信できませんでした。
        }
    });
                
  • サブデバイスの TSL モデルを初期化解除し、関連データを削除できます。

    次回 TSL モデルを使用する場合は、サブデバイスに IoT Platform へのログオンをリクエストし、TSL モデルを再初期化する必要があります。

    LinkKit.getInstance().getGateway().uninitSubDeviceThing(mBaseInfo);
                

基本的な通信

ゲートウェイをプロキシとして使用して、サブデバイスと IoT Platform 間でデータを送信します。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 必須。 サブデバイスが属するプロダクトの ProductKey。
deviceInfo.deviceName = deviceName; // 必須。 サブデバイスの DeviceName。
String topic = xxx;
String publishData = xxx;
// トピックをサブスクライブします。
LinkKit.getInstance().getGateway().gatewaySubDeviceSubscribe(topic, deviceinfo, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        // サブスクリプションが成功しました。
    }
    @Override
    public void onFailed(AError aError) {
        // サブスクリプションに失敗しました。
    }
});
// メッセージを公開します。
LinkKit.getInstance().getGateway().gatewaySubDevicePublish(topic, publishData, deviceinfo, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        // メッセージが公開されました。
    }
    @Override
    public void onFailed(AError aError) {
        // メッセージを公開できませんでした。
    }
});
// トピックのサブスクリプションを解除します。
LinkKit.getInstance().getGateway().gatewaySubDeviceUnsubscribe(topic, deviceinfo, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        // サブスクリプション解除が成功しました。
    }
    @Override
    public void onFailed(AError aError) {
        // サブスクリプション解除に失敗しました。
    }
});