このトピックでは、Java 用 Link SDK を初期化してデバイスを IoT Platform に接続する方法について説明します。
前提条件
プロダクトとデバイスが作成されていること。詳細については、「プロダクトとデバイスを作成する」をご参照ください。
デバイスの検証情報と、デバイスを接続するエンドポイントが取得されていること。
背景情報
Java 用 Link SDK では、[devicesecret] のみを使用してデバイスの ID を検証できます。次の表に、SDK でサポートされている検証方法を示します。
検証方法
登録方法
説明
該当なし
ProductKey、DeviceName、および DeviceSecret を含むデバイス証明書が各デバイスに書き込まれます。
事前登録
ProductKey と ProductSecret を含むプロダクト証明書が、プロダクトのすべてのデバイスに書き込まれます。
プロダクトに対して [動的登録] 機能を有効にする必要があります。
動的登録により、デバイスは DeviceSecret を取得できます。
事前登録なし
ProductKey と ProductSecret を含むプロダクト証明書が、プロダクトのすべてのデバイスに書き込まれます。
プロダクトに対して [動的登録] 機能を有効にする必要があります。
動的登録により、デバイスは ClientID と DeviceToken の組み合わせを取得できます。
説明事前登録によるプロダクトごとの一意の証明書検証と事前登録なしのプロダクトごとの一意の証明書検証の違いについては、「検証方法の違い」をご参照ください。
Java 用 Link SDK のパラメータについては、「LinkKitInitParams」をご参照ください。
デバイスごとの一意の証明書による検証
デバイスごとの一意の証明書検証のサンプルコード
String productKey = "${YourProductKey}"; // プロダクトキー
String deviceName = "${YourDeviceName}"; // デバイス名
String deviceSecret = "${YourDeviceSecret}"; // デバイスシークレット
LinkKitInitParams params = new LinkKitInitParams();
/**
* ステップ 1: MQTT 初期化に必要なパラメータを設定します。
*/
IoTMqttClientConfig config = new IoTMqttClientConfig();
MqttConfigure.mqttHost = "{YourInstanceId}.mqtt.iothub.aliyuncs.com:8883";
/*
* オフラインメッセージを受信するかどうかを指定します。
* このパラメータは、MQTT 接続の cleanSession パラメータに対応します。
*/
config.receiveOfflineMsg = false;
params.mqttClientConfig = config;
/**
* ステップ 2: デバイスの初期化に必要な検証情報を指定します。
*/
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
params.deviceInfo = deviceInfo;
/**
* ステップ 3: デバイスのユーザー名、トークン、および ClientID を指定します。
* このステップは、事前登録なしのプロダクトごとの一意の証明書検証方法を使用してデバイスを検証する場合にのみ必要です。
* デフォルトでは、このステップはスキップされます。
*/
// MqttConfigure.deviceToken="${YourDeviceToken}";
// MqttConfigure.clientId="${YourClientId}";
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); // 初期化完了
}
});初期化リクエストを送信した後に
onInitDoneが返された場合、初期化は成功です。onErrorが返された場合、初期化は失敗です。初期化に失敗した場合、ビジネス要件に基づいて必要なパラメータを設定してデバイスを再初期化できます。Java 用 Link SDK は、デバイスを IoT Platform に自動的に再接続しません。
初期化が成功し、デバイスが IoT Platform から切断された場合、Java 用 Link SDK はデバイスを IoT Platform に自動的に再接続します。
動的登録
プロダクトごとの一意の証明書検証は、動的登録とも呼ばれます。この機能は、IoT Platform から DeviceSecret をリクエストするために使用されます。プロダクトごとの一意の証明書検証方法は、事前登録なしと事前登録の 2 つのタイプに分類されます。この機能を使用する前に、次の前提条件が満たされていることを確認してください。
IoT Platform コンソールで作成したプロダクトに対して動的登録が有効になっていること。
デモパッケージの
deviceinfoファイルで、deviceSecret パラメータが空のままになっており、productSecret パラメータに値が指定されていること。次のサンプルコードのステップ 1、ステップ 2、およびステップ 3 が実行されていること。
動的登録が完了したら、動的登録の永続接続を閉じる必要があります。詳細については、ステップ 4 のサンプルコードをご参照ください。
サンプルコードは、事前登録によるプロダクトごとの一意の証明書検証を実行する方法を示しています。事前登録なしのプロダクトごとの一意の証明書検証を実行するには、サンプルコードのステップ 1 の使用上の注意をご参照ください。
デバイスのセキュリティを確保するために、プロダクトごとの一意の証明書検証方法を使用して DeviceSecret を取得したら、DeviceSecret をデバイスに書き込んでください。デバイスを IoT Platform に接続する場合は、このトピックの「デバイスごとの一意の証明書による検証」セクションをご参照ください。
次の表に、事前登録なしのプロダクトごとの一意の証明書検証方法と事前登録によるプロダクトごとの一意の証明書検証方法の違いを示します。
項目 | 事前登録 | 事前登録なし |
プロトコル | MQTT および HTTPS | MQTT |
リージョン |
| 中国 (上海) および中国 (北京) |
返される DeviceSecret | DeviceSecret の使用方法については、デバイスごとの一意の証明書検証のサンプルコードのステップ 1 をご参照ください。 | デバイスの ClientID と DeviceToken をデバイスに書き込みます。このようにして、デバイスを IoT Platform に接続するなどの特定の機能を使用するときに、この情報を使用できます。詳細については、デバイスごとの一意の証明書検証のサンプルコードのステップ 3 をご参照ください。 |
デバイスの登録 | IoT Platform コンソールでデバイスの DeviceName を事前登録する必要があります。 | IoT Platform コンソールでデバイスの DeviceName を事前登録する必要はありません。 |
使用回数 |
| IoT Platform コンソールで、同じ ProductKey、ProductSecret、および DeviceName を使用して、最大 5 つの物理デバイスを同時にアクティブ化できます。IoT Platform は、各デバイスに一意の ClientID と DeviceToken を生成します。 |
動的登録のサンプルコード:
String deviceName = "${YourDeviceName}"; // デバイス名
String productKey = "${YourProductKey}"; // プロダクトキー
String productSecret = "${YourProductSecret}"; // プロダクトシークレット
// ステップ 1: プロダクトごとの一意の証明書検証方法が事前登録なしであるか、事前登録であるかを確認します。
// ケース 1: registerType パラメータを regnwl に設定すると、事前登録なしのプロダクトごとの一意の証明書検証方法が使用され、デバイスを作成する必要はありません。
// ケース 2: registerType パラメータを空のままにするか、registerType パラメータを register に設定すると、事前登録によるプロダクトごとの一意の証明書検証方法が使用され、デバイスを作成する必要があります。
String registerType = "register";
// ステップ 2: 動的登録のエンドポイントを指定します。
MqttConfigure.mqttHost = "ssl://${YourMqttHostUrl}:8883";
MqttInitParams initParams = new MqttInitParams(productKey, productSecret, deviceName, "",registerType);
// ステップ 3: 新バージョンのパブリックインスタンスまたは Enterprise Edition インスタンスを使用する場合は、IoT Platform コンソールの [インスタンスの詳細] ページから取得したインスタンス ID を動的登録に指定します。
initParams.instanceId = "${YourInstanceId}";
final Object lock = new Object();
LinkKit.getInstance().deviceDynamicRegister(initParams, new IOnCallListener() {
@Override
public void onSuccess(com.aliyun.alink.linksdk.channel.core.base.ARequest request, com.aliyun.alink.linksdk.channel.core.base.AResponse response) {
try {
String responseData = new String((byte[]) response.data);
JSONObject jsonObject = JSONObject.parseObject(responseData);
// 事前登録によるプロダクトごとの一意の証明書検証方法が使用された場合に返される出力。
String deviceSecret = jsonObject.getString("deviceSecret");
// 事前登録なしのプロダクトごとの一意の証明書検証方法が使用された場合に返される出力。
String clientId = jsonObject.getString("clientId");
String deviceToken = jsonObject.getString("deviceToken");
// 返された資格情報を保存し、ステップ 4 に進みます。ステップ 4 を完了すると、onSuccess メソッドを使用してデバイスを IoT Platform に接続できます。
// スレッドを待機する API 操作を呼び出します。
synchronized (lock){
lock.notify();
}
} catch (Exception e) {
}
}
@Override
public void onFailed(ARequest aRequest, com.aliyun.alink.linksdk.channel.core.base.AError aError) {
System.out.println("mqtt dynamic registration failed"); // mqtt 動的登録に失敗しました
// スレッドを待機する API 操作を呼び出します。
synchronized (lock){
lock.notify();
}
}
@Override
public boolean needUISafety() {
return false;
}
});
try {
// ダウンストリームメッセージを待機します。ほとんどの場合、ダウンストリームメッセージは 1 秒以内に返されます。
synchronized (lock){
lock.wait(3000);
}
// ステップ 4: 動的登録インスタンスを無効にします。
// LinkKit.getInstance().deviceDynamicRegister コールバックで次の関数を実行しないでください。そうしないと、エラーが発生する可能性があります。
LinkKit.getInstance().stopDeviceDynamicRegister(2000, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
System.out.println("mqtt dynamic registration success"); // mqtt 動的登録に成功しました
// デバイスを IoT Platform に接続し、接続を初期化します。詳細については、このトピックの「デバイスごとの一意の証明書による検証」セクションをご参照ください。
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
System.out.println("mqtt dynamic registration failed"); // mqtt 動的登録に失敗しました
}
});
} catch (Exception e) {
}エンドポイントの指定
サンプルコード:
// MQTT リクエストの LinkKitInitParams パラメータにエンドポイントを指定します。
IoTMqttClientConfig clientConfig = new IoTMqttClientConfig();
clientConfig.channelHost = "a18wP******.iot-as-mqtt.cn-shanghai.aliyuncs.com:8883";
linkKitInitParams.mqttClientConfig = clientConfig; パラメータ:
パラメータ | 例 | 説明 |
channelHost | a18wP******.iot-as-mqtt.cn-shanghai.aliyuncs.com:8883 |
新バージョンと旧バージョンのパブリックインスタンス、Enterprise Edition インスタンス、およびエンドポイントについては、「インスタンスのエンドポイントを表示する」をご参照ください。 |
その他の設定
次のパラメータを設定して、デバイス接続に関連する追加設定を行うことができます。
MQTT 接続
項目
説明
サンプルコード
キープアライブ間隔
デバイスのキープアライブ間隔を指定します。このパラメータは、デバイスと IoT Platform 間で永続接続を維持できる期間を指定します。
MqttConfigure.setKeepAliveInterval(int interval);QoS レベル
サービス品質 (QoS) レベルを指定します。QoS レベルは、デバイスと IoT Platform 間のメッセージ配信の品質レベルを定義する契約です。有効な値:
0: 各メッセージは最大 1 回配信されます。1: 各メッセージは少なくとも 1 回配信されます。
- qos パラメータ。 MqttPublishRequest request = new MqttPublishRequest(); // 有効な値: 0 および 1。デフォルト値: 0。 request.qos = 0; request.isRPC = false; request.topic = topic.replace("request", "response"); String resId = topic.substring(topic.indexOf("rrpc/request/")+13); request.msgId = resId; // 上記のパラメータをビジネス要件に基づいて設定します。上記の情報は参考用としてのみ提供されています。 request.payloadObj = "{\"id\":\"" + resId + "\", \"code\":\"200\"" + ",\"data\":{} }";オフラインメッセージ
cleanSession パラメータは、オフラインメッセージを受信するかどうかを指定します。
/** * MQTT 初期化に必要なパラメータを設定します。 */ IoTMqttClientConfig config = new IoTMqttClientConfig(); config.productKey = deviceInfoData.productKey; config.deviceName = deviceInfoData.deviceName; config.deviceSecret = deviceInfoData.deviceSecret; config.channelHost = pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883"; /** * オフラインメッセージを受信するかどうかを指定します。 * 次の定義は、次のコードに対応します: receiveOfflineMsg = !cleanSession。デフォルトでは、オフラインメッセージは受信できません。 */ config.receiveOfflineMsg = false; params.mqttClientConfig = config;ロギングと Log4j のサポート
次のコマンドを実行して、デバッグログを取得できます。
ALog.setLevel(ALog.LEVEL_DEBUG); MqttLogger.isLoggable = true;Java 用 Link SDK V1.2.3.1 以降では、グローバルインターセプターの
log関数を設定して、ビジネス要件に基づいてログを処理できます。たとえば、Log4j を使用して、ファイルなどの永続ストレージにログを保存できます。サンプルコード:
ALog.setLogDispatcher(new ILogDispatcher() { @Override public void log(int level, String prefix, String msg) { switch (level){ case LEVEL_DEBUG: // デバッグレベル System.out.println("debug:"+ prefix + msg); break; case LEVEL_INFO: // 情報レベル System.out.println("info:" + prefix + msg); break; case LEVEL_ERROR: // エラーレベル System.out.println("error:" + prefix + msg); break; case LEVEL_WARNING: // 警告レベル System.out.println("warnings:" + prefix + msg); break; default: // その他 System.out.println("other:" + prefix + msg); } } });接続ステータスとダウンストリームメッセージリスナー
デバイスの接続および切断メッセージと、IoT Platform から送信されたデータをリッスンするには、次のリスナーを設定します。
IConnectNotifyListener notifyListener = new IConnectNotifyListener() { @Override public void onNotify(String connectId, String topic, AMessage aMessage) { // IoT Platform からのダウンストリームデータのコールバック。connectId、接続タイプ、IoT Platform からのダウンストリームトピック、および IoT Platform から送信されたメッセージ本文を指定する aMessage パラメータなど。 //String pushData = new String((byte[]) aMessage.data); // pushData の例: {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"} // method パラメータはサービスタイプを指定します。params パラメータはプッシュするデータの内容を指定します。 } @Override public boolean shouldHandle(String connectId, String topic) { // IoT Platform からのトピックのダウンストリームデータを処理するかどうかを指定します。 // トピックが処理されない場合、onNotify リスナーは IoT Platform からのトピックのダウンストリームデータを受信できません。 return true; // ビジネスシナリオに基づいて、リスナーに必要なデータ処理ロジックを指定します。 } @Override public void onConnectStateChange(String connectId, ConnectState connectState) { // 対応する接続タイプの接続ステータス変更のコールバック。接続ステータスの詳細については、SDK の ConnectState をご参照ください。 // SDK がネットワークの変動によりデバイスが IoT Platform から切断されたことを検出した場合、SDK は 1 秒、2 秒、4 秒、8 秒、128 秒の間隔でデバイスを自動的に再接続します。再試行間隔が 128 秒に達すると、SDK はデバイスが IoT Platform に再接続されるまで、128 秒の間隔で再試行します。 } } // 永続接続のステータスや IoT Platform からのダウンストリームデータなど、ダウンストリームデータをリッスンするリスナーを登録します。 LinkKit.getInstance().registerOnNotifyListener(notifyListener);初期化解除
次のコードは、初期化解除を実行する方法を示しています。
// notifyListener リスナーの登録を解除します。登録したリスナーの登録を必ず解除してください。 LinkKit.getInstance().unRegisterOnNotifyListener(notifyListener); LinkKit.getInstance().deinit();