Java 用 HTTP/2 SDK を使用して、デバイスと IoT Platform 間の接続を確立できます。この記事では、Java 用の SDK デモを提供します。このデモを参考に SDK を開発し、デバイスメッセージを IoT Platform にアップロードできます。
前提条件
Java 用の SDK デモでは、Maven プロジェクトが使用されます。開始する前に、Maven がインストールされていることを確認してください。
手順
- iot-http2-sdk-demo Java 用 HTTP/2 SDK デモをダウンロードします。
- IntelliJ IDEA または Eclipse を使用して、デモを Maven プロジェクトにインポートします。
- IoT Platform コンソールからデバイスの証明書情報を取得します。詳細については、プロダクトとデバイスを作成する[ユーザーガイド] の をご参照ください。
- H2Client.java 構成ファイルを変更します。
- パラメーターを構成します。
// IoT Platform コンソールからデバイスの ProductKey、DeviceName、および DeviceSecret を取得します。 String productKey = ""; String deviceName = ""; String deviceSecret = ""; // メッセージの送受信に使用するトピック。 String subTopic = "/" + productKey + "/" + deviceName + "/get"; String pubTopic = "/" + productKey + "/" + deviceName + "/update"; - HTTP/2 SDK を HTTP/2 サーバーに接続し、データ受信を構成します。
// endPoint: https://${YourProductKey}.iot-as-http2.${region}.aliyuncs.com String endPoint = "https://" + productKey + ".iot-as-http2.cn-shanghai.aliyuncs.com"; // クライアントデバイスの一意の識別子。 String clientId = InetAddress.getLocalHost().getHostAddress(); // 接続パラメーターを構成します。 Profile profile = Profile.getDeviceProfile(endPoint, productKey, deviceName, deviceSecret, clientId); // 値が true の場合、デバイスがオフラインのときに送信されたすべてのメッセージが削除されます。オフラインメッセージとは、受信されていないすべての QoS=0 または QoS=1 メッセージを指します。 profile.setCleanSession(false); // クライアントを構築します。 MessageClient client = MessageClientFactory.messageClient(profile); // データを受信します。 client.connect(messageToken -> { Message m = messageToken.getMessage(); System.out.println("receive message from " + m); return MessageCallback.Action.CommitSuccess; }); - トピックをサブスクライブします。
// トピックをサブスクライブします。HTTP/2 SDK が IoT Platform に接続されると、HTTP/2 SDK はコールバックで指定されたトピックからメッセージを受信できます。 CompletableFuture subFuture = client.subscribe(subTopic); System.out.println("sub result : " + subFuture.get()); - データを送信します。
// メッセージをパブリッシュします。 MessageToken messageToken = client.publish(pubTopic, new Message("hello iot".getBytes(), 0)); System.out.println("publish success, messageId: " + messageToken.getPublishFuture().get().getMessageId());
- パラメーターを構成します。
- 構成ファイルを変更した後、コードを実行します。
操作の説明
- ID 認証
デバイスを IoT Platform に接続するには、Profile を使用してデバイスの ID 情報とその他の関連パラメーターを構成する必要があります。次のサンプルコードは、操作パラメーターを構成する方法を示しています。
Profile profile = Profile.getDeviceProfile(endPoint, productKey, deviceName, deviceSecret, clientId); MessageClient client = MessageClientFactory.messageClient(profile); client.connect(messageToken -> { Message m = messageToken.getMessage(); System.out.println("receive message from " + m); return MessageCallback.Action.CommitSuccess; });Profile のパラメーター
パラメーター タイプ 必須 説明 endPoint String はい https://${YourProductKey}.iot-as-http2.${regionId}.aliyuncs.comの形式のエンドポイント。- ${YourProductKey} をプロダクトキーに置き換えます。
- ${regionId} を、IoT Platform サービスを購入したリージョンの ID に置き換えます。リージョン ID の詳細については、「リージョンとゾーン」をご参照ください。
productKey String はい デバイスが属するプロダクトのキー。この情報は IoT Platform コンソールから取得できます。 deviceName String はい デバイスの名前。この情報は IoT Platform コンソールから取得できます。 deviceSecret String はい デバイスのキー。この情報は IoT Platform コンソールから取得できます。 clientId String はい クライアントデバイスの一意の識別子。 cleanSession Boolean いいえ デバイスがオフラインのときに送信されたキャッシュされたメッセージを削除するかどうかを示します。 heartBeatInterval Long いいえ ハートビート間隔(ミリ秒)。 heartBeatTimeOut Long いいえ ハートビートタイムアウト時間(ミリ秒)。 multiConnection Boolean いいえ 複数接続を有効にするかどうかを示します。デバイスの ProductKey と DeviceName を使用して IoT Platform に接続する場合は、このパラメーターを false に設定します。 callbackThreadCorePoolSize Integer いいえ コールバックスレッドのコアプールのサイズ。 callbackThreadMaximumPoolSize Integer いいえ コールバックスレッドプールの最大スレッド数。 callbackThreadBlockingQueueSize Integer いいえ コールバックスレッドプールのブロッキングキューのサイズ。 authParams Map いいえ カスタム認証パラメーター。 - 接続の確立
MessageClient が生成された後、接続確立操作を呼び出してデバイスを IoT Platform に接続します。デバイスは、ID 認証に合格した後でのみ、IoT Platform にメッセージを送信し、IoT Platform からメッセージを受信できます。接続が確立されると、サーバーはすぐにサブスクライブされたメッセージを HTTP/2 SDK にプッシュします。そのため、接続を確立するときは、デフォルトのメッセージ受信操作を構成して、コールバックが構成されていないメッセージを受信する必要があります。次のサンプルコードは、接続確立操作を示しています。
void connect(MessageCallback messageCallback); - メッセージのサブスクリプション
/** * トピックをサブスクライブします。 * @param topic トピック * @return completableFuture サブスクライブ結果用 */ CompletableFuture subscribe(String topic); /** * トピックをサブスクライブし、トピックのコールバックを指定します。 * @param topic トピック * @param messageCallback このトピックでメッセージを受信したときのコールバック * @return completableFuture サブスクライブ結果用 */ CompletableFuture subscribe(String topic, MessageCallback messageCallback); /** * トピックのサブスクリプションを解除します。 * * @param topic トピック * @return completableFuture サブスクリプション解除結果用 */ CompletableFuture unsubscribe(String topic); - メッセージの受信
メッセージ受信を構成する前に、MessageCallback 操作を構成する必要があります。さらに、接続パラメーターを構成するか、トピックをサブスクライブするときに、MessageClient を渡す必要があります。次のサンプルコードは、メッセージ受信操作を示しています。
/** * * @param messageToken メッセージトークン * @return Action 消費後のアクション */ Action consume(final MessageToken messageToken);この操作は、HTTP/2 SDK が MessageToken.getMessage を呼び出すことによってメッセージを受信した後に呼び出されます。操作はスレッドプールで呼び出されます。スレッドのセキュリティの問題に注意してください。戻り値は、QoS=0 および QoS=1 メッセージの ACK を返すかどうかを決定します。次の表は、戻り値について説明しています。
戻り値 説明 Action.CommitSuccess ACK が返されます。 Action.CommitFailure ACK は返されません。HTTP/2 SDK は後でメッセージを再度受信します。 Action.CommitAckManually ACK は自動的に返されません。MessageClient.ack() を呼び出して、ACK を手動で返す必要があります。 - メッセージの送信
/** * 指定されたトピックにメッセージをパブリッシュします。 * * @param topic メッセージトピック * @param message メッセージエンティティ * @return completableFuture パブリッシュ結果用 */ MessageToken publish(String topic, Message message);