IoTがBridge SDKとして提供するブリッジサービスを使用して、デバイスをIoT Platformに接続し、デバイスとIoT Platform間の通信を有効にすることができます。 このトピックでは、デバイスの接続と切断、アップストリームとダウンストリームのメッセージ送信などの基本機能を使用するようにIoT as Bridge SDKを設定する方法について説明します。
IoTをブリッジSDKとして取得
IoT Platformは、IoT as Bridge SDKのデモを提供します。 詳細については、alibabacloud-iot-bridge-core-demoをご覧ください。
フローチャート
次の図は、IoT as Bridge SDKを使用してデバイスをIoT Platformに接続するフローチャートを示しています。
開発環境のデプロイ
Java開発環境をデプロイし、Mavenプロジェクトに次の依存関係を追加してIoTをBridge SDKとしてインポートします。
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>iot-as-bridge-sdk-core</artifactId>
<version>2.4.1</version>
</dependency>
初期化
SDKの初期化
BridgeBootstrapオブジェクトを作成し、bootstrap() メソッドを呼び出します。 このメソッドは、IoT Platformからダウンストリームメッセージを受信するために、DownlinkChannelHandlerコールバックをIoT as Bridge SDKに登録します。
IoT as Bridge SDKが初期化された後、SDKはブリッジ情報を読み取り、ブリッジの接続要求をIoT Platformに送信します。
サンプルコード:
BridgeBootstrap bridgeBootstrap = new BridgeBootstrap();
bridgeBootstrap.bootstrap (新しいDownlinkChannelHandler() {
@オーバーライド
public boolean pushToDevice(Session session, String topic, byte[] payload) {
// IoT Platformからダウンストリームメッセージを受信します。
String content = new String (バイト);
log.info("Get DownLink message, session :{}, {}, {}", session, topic, content);
return true;
}
@オーバーライド
public boolean broadcast(String topic, byte[] payload) {
return false;
}
});
ブリッジの設定
デフォルトでは、ブリッジはJavaプロジェクトのsrc/main/resources/ ディレクトリにあるapplication.conf設定ファイルを使用して設定されます。 ファイル形式はHOCONで、JSONスーパーセットです。
IoT as Bridge SDKは、typesafe.configファイルの設定に基づいて設定ファイルを解析します。
ブリッジを動的に登録したり、ブリッジのパラメータを直接設定したりできます。
デバイスを動的に登録する方法の詳細については、「高度な機能を使用する」トピックの動的に登録ブリッジのセクションを参照してください。 次の表に、ブリッジのパラメーターを示します。
パラメーター
必須
説明
productKey
必須
ブリッジが属する製品のProductKey。
deviceName
必須
ブリッジのDeviceName。
deviceSecret
必須
橋のDeviceSecret。
subDeviceConnectMode
任意
ブリッジのタイプ。
このパラメーターを3に設定すると、大きなサイズのブリッジが作成されます。 最大500,000台のデバイスをブリッジに接続できます。
このパラメーターを指定しない場合は、小さいサイズのブリッジが作成されます。 最大1,500台のデバイスをブリッジに接続できます。
大型ブリッジと小型ブリッジは、異なるポリシーを使用してデバイスを切断します。 詳細については、「IoT Platformからデバイスを切断する」をご参照ください。
http2Endpoint
必須
HTTP/2ゲートウェイのエンドポイント。 エンドポイントは、HTTP/2プロトコルを介してブリッジとIoT Platformの間に永続的な接続を確立するために使用されます。
エンドポイント形式:
Enterprise Editionインスタンス:
https://${IotInstanceI d}.http2.iothub.aliyuncs.com:443
${IotInstanceId} を購入したインスタンスのIDに置き換えます。
たとえば、インスタンスIDがiot-cn-g06kwb **** の場合、エンドポイントは
https:// iot-cn-g06kwb **** .http2.iothub.aliyuncs.com:443
です。パブリックインスタンス: 新しいバージョンのパブリックインスタンスのエンドポイント形式は、以前のバージョンのパブリックインスタンスのエンドポイント形式とは異なります。
新しいバージョンのパブリックインスタンスは、Enterprise Editionインスタンスと同じエンドポイント形式を使用します。
以前のバージョンのパブリックインスタンス:
https://${productKey}.iot-as-http2.${RegionI d}.aliyuncs.com:443
${productKey} を、ブリッジが属する製品のProductKeyに置き換えます。
${RegionId} を、IoT Platformサービスが存在するリージョンのIDに置き換えます。 リージョンIDの詳細については、「リージョンとゾーン」をご参照ください。
たとえば、ブリッジのProductKeyがa1abcab **** で、パブリックインスタンスが中国 (上海) リージョンにある場合、エンドポイントは
https:// a1abcab **** .iot-as-http2.cn-shanghai.aliyuncs.com:443
です。
IoT Platformインスタンスの詳細については、「概要」をご参照ください。
authEndpoint
必須
デバイス検証サービスのエンドポイント。
エンドポイント形式:
Enterprise Editionインスタンス:
https://${IotInstanceI d}.auth.iothub.aliyuncs.com/auth/bridge
${IotInstanceId} を購入したインスタンスのIDに置き換えます。
たとえば、インスタンスIDがiot-cn-g06kwb **** の場合、エンドポイントは
https:// iot-cn-g06kwb **** .auth.iothub.aliyuncs.com/auth/bridge
です。パブリックインスタンス: 新しいバージョンのパブリックインスタンスのエンドポイント形式は、以前のバージョンのパブリックインスタンスのエンドポイント形式とは異なります。
新しいバージョンのパブリックインスタンスは、Enterprise Editionインスタンスと同じエンドポイント形式を使用します。
以前のバージョンのパブリックインスタンス:
https:// iot-auth.${RegionI d}.aliyuncs.com/auth/bridge
${RegionId} を、IoT Platformサービスが存在するリージョンのIDに置き換えます。 リージョンIDの詳細については、「リージョンとゾーン」をご参照ください。
たとえば、インスタンスが中国 (上海) リージョンにある場合、エンドポイントは
https://iot-auth.cn-shanghai.aliyuncs.com/auth/bridge
です。
次のサンプルコードは、小型ブリッジを設定する方法を示しています。 この例では、Enterprise Editionインスタンスが使用されています。
// サービスのエンドポイント。 http2Endpoint = "https:// iot-2w **** .http2.iothub.aliyuncs.com:443" authEndpoint = "https:// iot-2w **** .auth.iothub.aliyuncs.com/auth/bridge" // ブリッジのパラメータ。 productKey = ${bridge-ProductKey-in-Iot-Plaform} deviceName = ${bridge-DeviceName-in-Iot-Plaform} deviceSecret = ${bridge-DeviceSecret-in-Iot-Plaform}
デバイスを検証し、デバイスをIoT Platformに接続する
デバイスをIoT Platformに接続する
次のサンプルコードは、IoT as Bridge SDKを使用してデバイスをIoT Platformに接続する方法を示しています。
/**
* デバイスを確認します。
* @ param newSession: ダウンストリームコールバックで返されるデバイスセッション情報。
* @ param originalIdentity: デバイスの元の識別子。
* @return
* /
パブリックブールdoOnline(Session newSession, String originalIdentity);
デバイスがIoT Platformに接続すると、デバイスはIoT Platformにセッション
を送信します。 IoT Platformがダウンストリームメッセージを送信すると、コールバック関数を使用してSession
がブリッジに送信されます。 ブリッジは、Session
のoriginalIdentityフィールドを使用して、メッセージが送信されるデバイスを決定します。
Session
には、デバイス接続に関する情報を含むオプションのチャネルフィールドが含まれます。 たとえば、ブリッジサーバーはNettyに基づいて構築されています。 channelフィールドを使用して、デバイスの永続的な接続に対応するチャネルオブジェクトを格納できます。 ダウンストリームメッセージが送信される場合、ブリッジは、セッション
からチャネルオブジェクトを取得することができる。
IoT as Bridge SDKは、チャネルフィールドのデータを処理しません。 チャネルフィールドを使用して、デバイス関連の情報を格納できます。
サンプルコード:
UplinkChannelHandler uplinkHandler = new UplinkChannelHandler();
// セッションを作成します。
オブジェクトチャネル=new Object();
セッションセッション=Session.newInstance(originalIdentity, channel);
// デバイスをIoT Platformに接続します。
boolean success = uplinkHandler.doOnline(session, originalIdentity);
if (成功) {
// デバイスがIoT Platformに接続されている場合、ブリッジはデバイスからの後続の通信要求を受け入れます。
} else {
// デバイスがIoT Platformへの接続に失敗した場合、ブリッジは切断要求などの後続の通信要求を拒否します。
}
デバイス証明書と元のデバイス識別子間のマッピングの設定
デフォルトでは、マッピングはJavaプロジェクトのsrc/main/resources/ ディレクトリにあるdevices.conf設定ファイルを使用して設定されます。 ファイル形式はHOCONで、JSONスーパーセットです。
IoT as Bridge SDKは、typesafe.configファイルの設定に基づいて設定ファイルを解析します。
ファイルに次のパラメーターを設定する必要があります。
${device-originalIdentity} {
productKey : ${device-ProductKey-in-Iot-Plaform}
deviceName : ${device-DeviceName-in-Iot-Platform}
deviceSecret : ${device-DeviceSecret-in-Iot-Platform}
}
パラメーター | 必須 | 説明 |
productKey | 必須 | デバイスが属するプロダクトのProductKey。 |
deviceName | 必須 | デバイスのDeviceName。 |
deviceSecret | 必須 | デバイスのDeviceSecret。 |
デバイスからIoT Platformにデータを送信する
次のサンプルコードは、IoT as Bridge SDKを使用してデバイスからIoT Platformにデータを送信する方法を示しています。
/**
* 同期モードでデバイスからメッセージを送信します。
* @ param originalIdentity: デバイスの元の識別子。
* @ param protocolMsg: トピック、ペイロード、およびサービス品質 (QoS) 情報を含む、送信されるメッセージ。
* @ param timeout: タイムアウト期間。 単位は秒です。
* @ return: メッセージがタイムアウト期間内に送信されたかどうかを示します。
* /
ブールdoPublish(String originalIdentity, ProtocolMessage protocolMsg, int timeout);
/**
* 非同期モードでデバイスからメッセージを送信します。
* @ param originalIdentity: デバイスの元の識別子。
* @ param protocolMsg: トピック、ペイロード、およびQoS情報を含む、送信されるメッセージ。
* @ return: このメソッドが呼び出されると、CompletableFutureオブジェクトがすぐに返され、その後の使用に使用できます。
* /
CompletableFuture<ProtocolMessage> doPublishAsync (文字列originalIdentity、
ProtocolMessage protocolMsg);
サンプルコード:
DeviceIdentity deviceIdentity = ConfigFactory.getDeviceConfigManager().getDeviceIdentity(originalIdentity);
ProtocolMessage protocolMessage = new ProtocolMessage();
protocolMessage.setPayload("Hello world".getBytes());
protocolMessage.setQos(0);
protocolMessage.setTopic(String.format("/% s/% s/update", deviceIdentity.getProductKey(), deviceIdentity.getDeviceName()));
// 同期モードでメッセージを送信します。
int timeoutSeconds = 3;
boolean success = upLinkHandler.doPublish(originalIdentity, protocolMessage, timeoutSeconds);
// 非同期モードでメッセージを送信します。
upLinkHandler.doPublishAsync(originalIdentity、protocolMessage);
IoT Platformからデバイスにデータをプッシュする
ブリッジに対してbootstrap() メソッドを呼び出すと、DownlinkChannelHandlerコールバックがIoTにbridge SDKとして登録されます。 IoT as Bridge SDKがIoT Platformからメッセージを受信すると、IoT as Bridge SDKはDownlinkChannelHandlerのpushToDevice() メソッドを呼び出します。
pushToDevice() メソッドを変更して、ブリッジがダウンストリームメッセージを処理できるようにすることができます。
IoT as Bridge SDKを使用してデバイスがIoT Platformに接続された後、デバイスはトピックをサブスクライブする必要なしにダウンストリームメッセージを受信できます。
pushToDevice() メソッドに時間のかかるロジックを実装しないでください。 それ以外の場合、下流メッセージを受信するスレッドはブロックされます。 時間のかかるロジックまたはI/Oロジックが必要な場合は、非同期でロジックを実装します。 たとえば、ブリッジが永続的な接続を使用してダウンストリームメッセージをデバイスに転送する場合、非同期でロジックを実装できます。
サンプルコード:
プライベート静的ExecutorService executorService = new ThreadPoolExecutor ()
Runtime.getRuntime().availableProcessors(),
Runtime.getRuntime().availableProcessors() * 2,
60, TimeUnit.SECONDS,
新しいLinkedBlockingQueue<>(1000) 、
new ThreadFactoryBuilder().setDaemon(true).setNameFormat("bridge-downlink-handle-% d").build() 、
新しいThreadPoolExecutor.AbortPolicy();
public static void main(String args[]) {
// デフォルトでは、application.confファイルとdevices.confファイルが使用されます。
BridgeBootstrap bridgeBootstrap = new BridgeBootstrap();
bridgeBootstrap.bootstrap (新しいDownlinkChannelHandler() {
@オーバーライド
public boolean pushToDevice(Session session, String topic, byte[] payload) {
// IoT Platformからダウンストリームメッセージを受信します。
executorService.submit(() -> handleDownLinkMessage (セッション、トピック、ペイロード));
return true;
}
@オーバーライド
public boolean broadcast(String s, byte[] bytes) {
return false;
}
});
}
private static void handleDownLinkMessage (セッションセッション、Stringトピック、byte[] payload) {
String content = new String(payload);
log.info("Get DownLink message, session :{}, topic :{}, content :{}", session, topic, content);
オブジェクトチャネル=session.getChannel();
String originalIdentity = session.getOriginalIdentity();
}
パラメーター | 説明 |
セッション | doOnlineメソッドを呼び出すときに指定したセッション。 このパラメータは、ダウンストリームメッセージが送信されるデバイスを決定するために使用されます。 |
topic | 下流メッセージのトピック。 |
payload | 下流メッセージのメッセージ本文。 メッセージ本文はバイナリ形式です。 |
IoT Platformからデバイスを切断する
デバイスの切断が発生するシナリオを次に示します。
小型ブリッジがIoT Platformから切断された場合、ブリッジに接続されているすべてのデバイスは自動的にIoT Platformから切断されます。
大型ブリッジがIoT Platformから切断された場合、ブリッジに接続されているデバイスはIoT Platformから切断されません。 ブリッジがIoT Platformに再接続された後、doOfflineメソッドを呼び出してデバイスのステータスを更新できます。
デバイスのステータスは、デバイスがブリッジに接続されているかどうかを示します。 ブリッジは、デバイスのステータス情報をIoT Platformに送信します。 ブリッジがデバイスのステータス情報をIoT Platformに送信できない場合、IoT Platformコンソールに表示されるステータスは変更されません。
たとえば、デバイスがブリッジを使用してIoT Platformに接続され、デバイスのステータスがオンラインであるとします。 ブリッジがIoT Platformから切断された場合、ブリッジはデバイスのステータス情報をIoT Platformに送信できません。 その結果、デバイスのステータスはオンラインのままです。
小型および大型のブリッジがIoT Platformに接続されている場合、ブリッジはデバイスをIoT Platformから切断する要求を送信できます。
次のサンプルコードは、切断リクエストを送信する方法を示しています。
/** * IoT Platformからデバイスを切断するリクエストを送信します。 * @ param originalIdentity: デバイスの元の識別子。 * @ return: 切断要求が送信されたかどうかを示します。 * / ブールdoOffline(String originalIdentity);
サンプルコード:
upLinkHandler.doOffline(originalIdentity);
ブリッジが閉じてIoT Platformへの接続を再確立する
ブリッジは、BridgeBootstrapオブジェクトを使用し、disconnectBridgeおよびreconnectBridgeメソッドを呼び出して、IoT Platformへの接続を閉じて再確立できます。
reconnectBridgeメソッドは再接続に使用され、最初の接続には使用できません。
サンプルコード:
// IoT Platformからブリッジを切断します。
bridgeBootstrap.disconnectBridge();
Thread.sleep(1000);
// ブリッジがIoT Platformに接続されているかどうかを確認します。
ブールisConnected = bridgeBootstrap.isBridgeConnected();
// IoT Platformへの接続を再確立します。
bridgeBootstrap.reconnectBridge();
Thread.sleep(1000);
isConnected = bridgeBootstrap.isBridgeConnected();