サブデバイスは、ゲートウェイを使用してのみIoT Platformに接続できます。 サブデバイスがゲートウェイに接続された後、ゲートウェイは、ゲートウェイとサブデバイスとの間にトポロジー関係が存在するかどうかをチェックする。 その場合、ゲートウェイはサブデバイスに関する情報をIoT Platformに報告し、サブデバイスをIoT Platformに接続します。
前提条件
開始する前に、次の操作が実行されていることを確認してください。
背景情報
- サブデバイスの設定
サブデバイスはIoT Platformに直接接続できません。 したがって、IoT Platformが提供するデバイスSDKをサブデバイスにインストールする必要はありません。 サブデバイスのデバイスSDKは、そのプロバイダーによって開発されている必要があります。
- IoT Platformが提供するSDKパッケージ
java/src/main/java/com/aliyun/iot/api/common/deviceApiディレクトリのDeviceTopoManagerファイルには、ゲートウェイがトポロジ関係の管理、サブデバイス証明書の取得、およびゲートウェイを使用してサブデバイスをIoT Platformに接続するために使用するコードが含まれています。
ステップ1: ゲートウェイを使用してトポロジ関係を管理する
ゲートウェイがIoT Platformに接続された後、ゲートウェイはそのトポロジ関係をIoT Platformに同期する必要があります。 このようにして、ゲートウェイはサブデバイスとIoT Platform間の通信を実装できます。 IoT Platformコンソールでトポロジ関係を表示および追加できます。 サンプルコードを使用して、これらの操作を実行することもできます。
- IoT Platformコンソールで、ゲートウェイとサブデバイス間のトポロジ関係を表示および追加します。
- 左側のナビゲーションウィンドウで、 を選択します。 [デバイス] ページで、ゲートウェイデバイスを見つけます。
- [操作] 列で [サブデバイス] をクリックします。 表示されるページで、ゲートウェイのサブデバイスを表示します。
- [サブデバイスの追加] をクリックします。 [ゲートウェイとサブデバイスの作成] ステップで作成したサブデバイスを追加します。
- 次のサンプルコードを使用して、トポロジ関係を照会および追加します。
-
次のサンプルコードを使用してトポロジ関係を照会します。
/** * ゲートウェイのトポロジ関係を取得し、ゲートウェイとサブデバイスの間にトポロジ関係が存在するかどうかを確認します。 */ private void getGWDeviceTopo() { LinkKit.getInstance().getGateway().gatewayGetSubDevices(new IConnectSendListener() { @オーバーライド public void onResponse(ARequest request, AResponse aResponse) { ALog.i(TAG, "ゲートウェイのトポロジ関係が取得されます。" + JSONObject.toJSONString(aResponse)); // サブデバイスのリストを取得します。 try { ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() { }.getType()); // 実際のシナリオに基づいてリクエストを処理します。 } catch (Exception e) { e.printStackTrace(); } } @オーバーライド public void onFailure(ARequestリクエスト、AErrorエラー) { ALog.i(TAG, "Failed to get the topological relationship of the gateway: " + JSONObject.toJSONString(error)); } }); } -
次のサンプルコードを使用して、トポロジ関係を追加します。説明
- サブデバイスの証明情報を取得する方法については、ステップ2を参照してください。
- IoT Platformがゲートウェイとサブデバイス間のトポロジ関係を検証した後、サブデバイスはゲートウェイの物理チャネルを使用してIoT Platformと通信できます。
/** * トポロジ関係を追加するサブデバイスに関する情報を指定します。 */ private void gatewayAddSubDevice() { BaseInfo baseInfo1=新しいBaseInfo(); baseInfo1.productKey = "a1j7SyR ****"; baseInfo1.deviceName = "safa ***"; 文字列deviceSecret = "7lzCJIWHmGFpZpDKbJdVucDHUz6C ****"; LinkKit.getInstance().getGateway().gatewayAddSubDevice(baseInfo1, new ISubDeviceConnectListener() { @オーバーライド public String getSignMethod() { // リクエストの署名に使用する署名メソッド。 return "hmacsha1"; } @オーバーライド public String getSignValue() { // DeviceSecretに基づいて署名を生成します。 Map<String, String> signMap = new HashMap<>(); signMap.put("productKey" 、baseInfo1.productKey); signMap.put("deviceName" 、baseInfo1.deviceName); // signMap.put("timestamp", String.valueOf(System.currentTimeMillis())); signMap.put("clientId", getClientId()); SignUtils.hmacSign(signMap, deviceSecret) を返します。 } @オーバーライド public String getClientId() { // 必要に応じてclientIdパラメーターを設定します。 return "id"; } @オーバーライド public Map<String, Object> getSignExtraData() { ヌルを返します。 } @オーバーライド public void onConnectResult(boolean isSuccess, ISubDeviceChannel iSubDeviceChannel, AError aError) { // サブデバイスとゲートウェイ間のトポロジ関係を追加する操作の結果を処理します。 if (isSuccess) { // トポロジ関係が追加された後、ゲートウェイを使用してサブデバイスをIoT Platformに接続できます。 ALog.i(TAG, "トポロジー関係が追加されました:" + JSONObject.toJSONString(iSubDeviceChannel)); // ゲートウェイを使用してサブデバイスをIoT Platformに接続します。 gatewaySubDeviceLogin(); } else { ALog.i(TAG, "Failed to add the topological relationship: " + JSONObject.toJSONString(aError)); } } @オーバーライド public void onDataPush (文字列s, AMessage aMessage) { } }); }
-
ステップ2: サブデバイスに関する証明書情報を取得する
- デバイスごとに一意の証明書
サブデバイスのProductKey、DeviceName、およびDeviceSecretは、IoT Platformコンソールのサブデバイスの詳細ページで取得できます。
- ゲートウェイは、接続されたサブデバイスを発見した後、ゲートウェイとサブデバイスとの間で定義されたプロトコルに基づいて、サブデバイスの証明書を取得することができる。 プロトコルは、ゲートウェイのプロバイダおよびサブデバイスのプロバイダによって定義される。
- ゲートウェイのプロバイダは、ゲートウェイがサブデバイスに関する証明書情報をプリセットすることを可能にする構成方法を提供する。 この機能は、ゲートウェイのプロバイダによって実装される。
- 動的サブデバイス登録
ゲートウェイは、サブデバイスを登録するためにサブデバイスのProductKeyとDeviceNameをIoT Platformに報告します。 IoT PlatformがサブデバイスのProductKeyとDeviceNameを検証した後、IoT PlatformはDeviceSecretをサブデバイスに動的に割り当てます。
- IoT Platformでサブデバイスを作成するときは、deviceNameパラメーターをサブデバイスのシリアル番号またはMACアドレスに設定します。 サブデバイスが作成されたら、サブデバイスの動的登録を有効にします。

- ゲートウェイを設定するときは、ゲートウェイがサブデバイスのモデルと一意の識別子 (シリアル番号またはMACアドレス) を取得できることを確認してください。 これは、ゲートウェイとサブデバイスとの間で定義されるプロトコルによって可能になる。 さらに、サブデバイスモデルをIoT PlatformのProductKeyにマップします。
- 動的登録中にIoT PlatformからサブデバイスのDeviceSecretを取得します。
サンプルコード:
/** * 動的登録中にサブデバイスのDeviceSecretを取得します。 * IoT Platformでサブデバイスを作成するときは、deviceNameパラメーターをサブデバイスのシリアル番号またはMACアドレスに設定します。 */ private void gatewaySubDevicRegister() { リスト <BaseInfo> subDevices = new ArrayList<>(); BaseInfo baseInfo1=新しいBaseInfo(); baseInfo1.productKey = "a1j7SyR ***"; baseInfo1.deviceName = "safasdf"; subDevices.add(baseInfo1); LinkKit.getInstance().getGateway().gatewaySubDevicRegister(subDevices, new IConnectSendListener() { @オーバーライド public void onResponse(ARequestリクエスト、AResponseレスポンス) { ALog.i(TAG, "サブデバイスは登録されています:" + JSONObject.toJSONString (応答)); } @オーバーライド public void onFailure(ARequestリクエスト、AErrorエラー) { ALog.i(TAG, "Failed to register the sub-device: " + JSONObject.toJSONString (エラー)); } }); }デバイスの動的登録の詳細については、「概要」をご参照ください。
- IoT Platformでサブデバイスを作成するときは、deviceNameパラメーターをサブデバイスのシリアル番号またはMACアドレスに設定します。 サブデバイスが作成されたら、サブデバイスの動的登録を有効にします。
ステップ3: ゲートウェイを使用してサブデバイスをIoT Platformに接続します。
/**
* APIを呼び出してサブデバイスをIoT Platformに接続する前に、サブデバイスとゲートウェイの間にトポロジ関係が追加されていることを確認してください。 ゲートウェイが接続されたサブデバイスを検出すると、ゲートウェイはサブデバイスに関する情報をIoT Platformに報告します。
* ゲートウェイを使用してサブデバイスをIoT Platformに接続した後、ゲートウェイはトピックをサブスクライブし、サブデバイスのメッセージを公開できます。
*/
public void gatewaySubDeviceLogin(){
BaseInfo baseInfo1=新しいBaseInfo();
baseInfo1.productKey = "a1j7SyR ****";
baseInfo1.deviceName = "safasdf";
LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(baseInfo1, new ISubDeviceActionListener() {
@オーバーライド
public void onSuccess() {
// ゲートウェイはサブデバイスをIoT Platformに接続します。
// ゲートウェイは、サブデバイスのトピックをサブスクライブしたり、メッセージを公開したりできます。 ゲートウェイは、サブデバイスを削除または無効にすることもできます。
// subDevDisable(null);
// subDevDelete(null);
}
@オーバーライド
public void onFailed(AError aError) {
ALog.d(TAG, "onFailed() called with: aError = [" + aError + "]");
}
});
}
}
付録: サンプルコード
ゲートウェイは、接続されたサブデバイスを検出し、サブデバイスに関する情報をIoT Platformに報告します。 IoT Platformは、サブデバイスとIoT Platformの間に論理チャネルを確立します。 サブデバイスは、ゲートウェイの物理チャネルを使用してIoT Platformと通信します。 上記のプロセスは、次のサンプルコードで実装できます。
packag e com.aliyun.iot.api.com mon.de viceApi;
com.alibaba.fastjson.JSONObjectをインポートします。com.alibaba.fastjson.TypeReferenceをインポートします。com.aliyun.alink.dm.api.BaseInfoをインポートします。com.aliyun.alink.dm.api.DeviceInfoをインポートします。com.aliyun.alink.dm.api.InitResultをインポートします。com.aliyun.alink.dm.api.SignUtilsをインポートします。com.aliyun.alink.dm.mo del.ResponseModelをインポートします。com.aliyun.alink.linkkit.api.ILinkKitConnectListenerをインポートします。com.aliyun.alink.linkkit.api.IoTMqttClientConfigをインポートします。com.aliyun.alink.linkkit.api.LinkKitをインポートします。com.aliyun.alink.linkkit.api.LinkKitInitParamsをインポートします。com.aliyun.alink.linksdk.channel.gateway.api.subdevice.ISubDeviceActionListenerをインポートします。com.aliyun.alink.linksdk.channel.gateway.api.subdevice.ISubDeviceChannelをインポートします。com.aliyun.alink.linksdk.channel.gateway.api.subdevice.ISubDeviceConnectListenerをインポートします。com.aliyun.alink.linksdk.channel.gateway.api.subdevice.ISubDeviceRemoveListenerをインポートします。com.aliyun.alink.linksdk.cmp.core.base.AMessageをインポートします。com.aliyun.alink.linksdk.cmp.core.base.ARequestをインポートします。com.aliyun.alink.linksdk.cmp.core.base.AResponseをインポートします。com.aliyun.alink.linksdk.cmp.core.listener.IConnectSendListenerをインポートします。com.aliyun.alink.linksdk.tools.AErrorをインポートします。com.aliyun.alink.linksdk.tools.ALogをインポートします。java.util.* をインポートします。静的com.aliyun.alink.linksdk.tools.ALog.LEVEL_DEBUGをインポートします。public class DeviceTopoManager {
プライベート静的文字列regionId = "cn-shanghai";
プライベート静的最終文字列TAG = "TOPO";
// ゲートウェイデバイスに関する情報。
プライベート静的文字列GWproductKey = "a1Bxp **********";
プライベート静的文字列GWdeviceName = "XMtrv3y *************";
プライベート静的文字列GWdeviceSecret = "19xJNybifnmgc **************";
public static void main(String[] args) {
/**
* MQTT接続に関する情報。
*/
DeviceTopoManagerマネージャー=新しいDeviceTopoManager();
/**
* このデバイスのJava HTTPクライアントはTSLv1.2をサポートしています。
*/
System.setProperty("https.protocols" 、"TLSv2");
manager.init();
}
public void init() {
LinkKitInitParams params = new LinkKitInitParams();
/**
* MQTT初期化のパラメータを指定します。
*/
IoTMqttClientConfig config = new IoTMqttClientConfig();
config.productKey = GWproductKey;
config.de viceName = GWdeviceName;
config.de viceSecret = GWdeviceSecret;
config.channelHost = GWproductKey + ".iot-as-mqtt" + regionId + ".aliyuncs.com:1883";
/**
* オフラインメッセージを受信するかどうかを指定します。
* MQTT接続に対応するcleanSessionフィールド。
*/
config.receiveOfflineMsg = false;
params.mqttClientConfig = config;
ALog.setLevel(LEVEL_DEBUG);
ALog.i(TAG、"mqtt connetcion info=" + params);
/**
* 初期化を設定し、ゲートウェイデバイスに関する証明書情報を渡します。
*/
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = GWproductKey;
deviceInfo.de viceName = GWdeviceName;
deviceInfo.de viceSecret = GWdeviceSecret;
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);
// ゲートウェイのトポロジ関係を取得し、ゲートウェイとサブデバイスの間にトポロジ関係が存在するかどうかを確認します。
// ゲートウェイとサブデバイスの間にトポロジ関係が存在する場合、ゲートウェイはサブデバイスをIoT Platformに接続します。
getGWDeviceTopo();
// サブデバイスを動的に登録して、サブデバイスのDeviceSecretを取得します。 ゲートウェイがサブデバイスの証明書を取得している場合は、この手順をスキップします。
// IoT Platformでサブデバイスを作成するときは、deviceNameパラメーターをサブデバイスのシリアル番号またはMACアドレスに設定します。
gatewaySubDevicRegister();
// トポロジ関係を追加するサブデバイスに関する情報を指定します。
gatewayAddSubDevice();
}
});
}
/**
* ゲートウェイのトポロジ関係を取得し、ゲートウェイとサブデバイスの間にトポロジ関係が存在するかどうかを確認します。
*/
private void getGWDeviceTopo() {
LinkKit.getInstance().getGateway().gatewayGetSubDevices(new IConnectSendListener() {
@オーバーライド
public void onResponse(ARequest request, AResponse aResponse) {
ALog.i(TAG, "ゲートウェイのトポロジ関係が取得されます。" + JSONObject.toJSONString(aResponse));
// サブデバイスのリストを取得します。
try {
ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() {
}.getType());
// TODO。 実際のアプリケーションシナリオに基づいてコードを記述します。
} catch (Exception e) {
e.printStackTrace();
}
}
@オーバーライド
public void onFailure(ARequestリクエスト、AErrorエラー) {
ALog.i(TAG, "Failed to get the topological relationship of the gateway: " + JSONObject.toJSONString(error));
}
});
}
/**
* サブデバイスを動的に登録して、サブデバイスのDeviceSecretを取得します。 ゲートウェイがサブデバイスの証明書を取得している場合は、この手順をスキップします。
* IoT Platformでサブデバイスを作成するときは、deviceNameパラメーターをサブデバイスのシリアル番号またはMACアドレスに設定します。
*/
private void gatewaySubDevicRegister() {
リスト <BaseInfo> subDevices = new ArrayList<>();
BaseInfo baseInfo1=新しいBaseInfo();
baseInfo1.productKey = "a1j7SyR **********";
baseInfo1.deviceName = "test123 *********";
subDevices.add(baseInfo1);
LinkKit.getInstance().getGateway().gatewaySubDevicRegister(subDevices, new IConnectSendListener() {
@オーバーライド
public void onResponse(ARequestリクエスト、AResponseレスポンス) {
ALog.i(TAG, "サブデバイスは登録されています:" + JSONObject.toJSONString (応答));
}
@オーバーライド
public void onFailure(ARequestリクエスト、AErrorエラー) {
ALog.i(TAG, "Failed to register the sub-device: " + JSONObject.toJSONString (エラー));
}
});
}
/**
* トポロジ関係を追加するサブデバイスに関する情報を指定します。
*/
private void gatewayAddSubDevice() {
BaseInfo baseInfo1=新しいBaseInfo();
baseInfo1.productKey = "a1j7Sy ************";
baseInfo1.deviceName = "safasd ********";
文字列deviceSecret = "7lzCJIWHmGF **************";
LinkKit.getInstance().getGateway().gatewayAddSubDevice(baseInfo1, new ISubDeviceConnectListener() {
@オーバーライド
public String getSignMethod() {
// リクエストの署名に使用する署名メソッド。
return "hmacsha1";
}
@オーバーライド
public String getSignValue() {
// DeviceSecretに基づいて署名を生成します。
Map<String, String> signMap = new HashMap<>();
signMap.put("productKey" 、baseInfo1.productKey);
signMap.put("deviceName" 、baseInfo1.deviceName);
// signMap.put("timestamp", String.valueOf(System.currentTimeMillis()));
signMap.put("clientId", getClientId());
SignUtils.hmacSign(signMap, deviceSecret) を返します。
}
@オーバーライド
public String getClientId() {
// 必要に応じてclientIdパラメーターを設定します。
return "id";
}
@オーバーライド
public Map<String, Object> getSignExtraData() {
ヌルを返します。
}
@オーバーライド
public void onConnectResult(boolean isSuccess, ISubDeviceChannel iSubDeviceChannel, AError aError) {
// サブデバイスとゲートウェイ間のトポロジ関係を追加する操作の結果を処理します。
if (isSuccess) {
// トポロジ関係が追加された後、ゲートウェイを使用してサブデバイスをIoT Platformに接続できます。
ALog.i(TAG, "トポロジー関係が追加されました:" + JSONObject.toJSONString(iSubDeviceChannel));
// ゲートウェイを使用してサブデバイスをIoT Platformに接続します。
gatewaySubDeviceLogin();
} else {
ALog.i(TAG, "Failed to add the topological relationship: " + JSONObject.toJSONString(aError));
}
}
@オーバーライド
public void onDataPush (文字列s, AMessage aMessage) {
}
});
}
public void gatewayDeleteSubDevice(){
BaseInfo baseInfo1=新しいBaseInfo();
baseInfo1.productKey = "a1j7S **************";
baseInfo1.deviceName = "saf *********";
LinkKit.getInstance().getGateway().gatewayDeleteSubDevice(baseInfo1, new ISubDeviceRemoveListener() {
@オーバーライド
public void onSuceess() {
// サブデバイスが削除されます。 サブデバイスは、削除する前に切断できます。
}
@オーバーライド
public void onFailed(AError aError) {
// サブデバイスの削除に失敗しました。
}
});
}
/**
* APIを呼び出してサブデバイスをIoT Platformに接続する前に、サブデバイスとゲートウェイの間にトポロジ関係が追加されていることを確認してください。 ゲートウェイが接続されたサブデバイスを検出すると、ゲートウェイはサブデバイスに関する情報をIoT Platformに報告します。
* サブデバイスがIoT Platformに接続された後、ゲートウェイはトピックをサブスクライブし、サブデバイスのメッセージを公開できます。
*/
public void gatewaySubDeviceLogin(){
BaseInfo baseInfo1=新しいBaseInfo();
baseInfo1.productKey = "a1j7SyR ***********";
baseInfo1.deviceName = "safa *********";
LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(baseInfo1, new ISubDeviceActionListener() {
@オーバーライド
public void onSuccess() {
// ゲートウェイはサブデバイスをIoT Platformに接続します。
// ゲートウェイは、サブデバイスのトピックをサブスクライブしたり、メッセージを公開したりできます。 ゲートウェイは、サブデバイスを削除または無効にすることもできます。
// subDevDisable(null);
// subDevDelete(null);
}
@オーバーライド
public void onFailed(AError aError) {
ALog.d(TAG, "onFailed() called with: aError = [" + aError + "]");
}
});
}
}