このトピックでは、サーバー側サブスクリプションを設定して、プロダクトのデバイスステータス変更通知を Simple Message Queue (formerly MNS) (SMQ) キューにプッシュする方法について説明します。その後、ご利用のサーバーは MNS キューをリッスンすることで、これらの通知を受信できます。
前提条件
-
次の Alibaba Cloud サービスが有効化されていることを確認してください:
-
開発環境を準備します。この例では、次の Java 開発環境を使用します:
-
オペレーティングシステム: 64 ビット Windows 10
-
JDK バージョン: JDK 8
-
統合開発環境 (IDE): IntelliJ IDEA Community Edition
-
サーバー側サブスクリプションの設定
IoT Platform コンソールで、MNS のサーバー側サブスクリプションを作成し、サブスクライブするメッセージタイプを選択します。
-
IoT Platform コンソールにログインします。
[概要] ページで、管理するインスタンスを見つけ、インスタンス ID またはインスタンス名をクリックします。
-
左側のナビゲーションウィンドウで、 を選択します。次に、[プロダクトの作成] をクリックして、ガス検知器プロダクトを作成します。
-
を選択して、ガス検知器プロダクト配下にデバイスを作成します。
デバイス証明書は、デバイス側 SDK を設定する際に必要です。
-
左側のナビゲーションウィンドウで、 を選択します。次に、[サブスクリプションの作成] をクリックして、MNS のサーバー側サブスクリプションを作成します。詳細については、「MNS のサーバー側サブスクリプションの使用」をご参照ください。
説明初めて MNS へのメッセージ転送を設定する場合、プロンプトで [承認] をクリックする必要があります。その後、RAM コンソールにリダイレクトされ、IoT Platform に MNS へのアクセス権を付与します。
この例では、メッセージタイプとして [デバイスステータス変更通知] を選択します。これにより、プロダクトのすべてのデバイスステータス変更通知が MNS キューにプッシュされるようになります。
サブスクリプションが作成されると、IoT Platform はメッセージを受信するためのキューを MNS に自動的に作成します。キュー名は
aliyun-iot-${yourProductKey}のフォーマットです。MNS SDK を設定してメッセージをリッスンする際には、このキュー名を使用する必要があります。サブスクリプションリストで、MNS の横にあるアイコンをクリックして MNS キュー名を表示します。
サーバー側 MNS SDK の設定
この例では、MNS SDK for Java のデモを使用します。
-
「MNS SDK for Java リリースノート」に移動し、サンプルパッケージをダウンロードして解凍します。
この例では、aliyun-sdk-mns-samples-1.1.9.1.zip サンプルパッケージを使用します。
-
IntelliJ IDEA で、aliyun-sdk-mns-samples-1.1.9.1 フォルダをプロジェクトとしてインポートします。
-
ローカルディレクトリ C:\Users\${YourComputerUserName} に、.aliyun-mns.properties という名前のプロパティファイルを作成します。このファイルに、ご利用の MNS 認証情報を次のフォーマットで追加します:
説明Linux のホームディレクトリは /home/YOURNAME/ です。Windows のホームディレクトリは C:\Users\YOURNAME です。
mns.accountendpoint=http://${your_accountId}.mns.${your_regionId}.aliyuncs.com mns.accesskeyid=${your_accesskeyid} mns.accesskeysecret=${your_accesskeysecret}パラメーター
説明
accountendpoint
ご利用の MNS サービスのエンドポイントです。これは Message Service (MNS) コンソールで確認できます。キューがあるリージョンを選択し、キューの [詳細] をクリックします。
accesskeyid
ご利用の Alibaba Cloud アカウントの AccessKey ID と AccessKey Secret です。
IoT Platform コンソールにログインし、プロフィール画像にポインターを合わせ、[AccessKey の管理] をクリックして AccessKey ID と AccessKey Secret を取得します。
accesskeysecret
-
\src\main\java\com.aliyun.mns.sample.Queue ディレクトリにある ComsumerDemo.java ファイルで、IoT Platform によって自動的に作成された Simple Message Queue (formerly MNS) キューの名前を指定します。
public static void main(String[] args) { CloudAccount account = new CloudAccount( ServiceSettings.getMNSAccessKeyId(), ServiceSettings.getMNSAccessKeySecret(), ServiceSettings.getMNSAccountEndpoint()); MNSClient client = account.getMNSClient(); // クライアントを初期化します。 // メッセージを消費します。 try{ CloudQueue queue = client.getQueueRef("aliyun-iot-a1eN7La****");// これを IoT Platform によって自動的に作成されたキュー名に置き換えます。 for (int i = 0; i < 10; i++) { Message popMsg = queue.popMessage(); // キューからメッセージをポップします。 if (popMsg != null){ System.out.println("message handle: " + popMsg.getReceiptHandle()); System.out.println("message body: " + popMsg.getMessageBodyAsString()); // 生のメッセージ本文を取得します。 System.out.println("message id: " + popMsg.getMessageId()); System.out.println("message dequeue count:" + popMsg.getDequeueCount()); // ここにメッセージ処理ロジックを追加します。 // キューからメッセージを削除します。 queue.deleteMessage(popMsg.getReceiptHandle()); System.out.println("delete message successfully.\n"); } } } catch (Exception e) { e.printStackTrace(); } } -
ComsumerDemo.java ファイルを実行します。
デバイス側 SDK の設定
-
「Link SDK」に移動し、SDK for Java を選択します。
-
Link SDK for Java デモをダウンロードしてパッケージを解凍します。
説明このデモをダウンロードすることにより、ソフトウェアライセンス契約に同意したことになります。
-
IntelliJ IDEA で、JavaLinkKitDemo プロジェクトをインポートします。
-
device_id ファイルに、ご利用のデバイス証明書情報を入力します。
{ "productKey": "xxx", "deviceName": "Esensor", "productSecret": "", "deviceSecret": "1xxx?2" } -
\src\main\java\com.aliyun.alink.devicesdk.demo ディレクトリにある MqttSample.java ファイルで、パブリッシュ Topic をご利用のデバイス Topic に設定します。
public class MqttSample extends BaseSample { final static String TAG = "MqttSample"; public MqttSample(String pk, String dn) { super(pk, dn); } /** * パブリッシュ API の例です。 */ public void publish() { MqttPublishRequest request = new MqttPublishRequest(); // ユースケースに基づいて Topic を指定します。 request.topic = "/sys/" + productKey + "/" + deviceName + "/thing/deviceinfo/update"; } } -
\src\main\java\com.aliyun.alink.devicesdk.demo ディレクトリにある HelloWorld.java ファイルに、デバイス接続情報を入力します。
デバイス接続情報を取得するには、「インスタンスエンドポイントの表示と設定」をご参照ください。
channelHostのフォーマットは{productKey}.iot-as-mqtt.{region}.aliyuncs.com:1883です。コード例:public void init(final DeviceInfoData deviceInfoData) { this.pk = deviceInfoData.productKey; this.dn = deviceInfoData.deviceName; LinkKitInitParams params = new LinkKitInitParams(); /** * 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"; /** * オフラインメッセージを受信するかどうかを指定します。 * これは MQTT の cleanSession フィールドに対応します。 */ // ... } -
HelloWorld.java ファイルを実行してデバイスを接続します。
結果の検証
デバイス側 SDK が実行されると、デバイスオンライン通知がサーバー側サブスクリプションを介して Simple Message Queue (formerly MNS) キューに送信されます。その後、Simple Message Queue (formerly MNS) SDK はキューからメッセージを消費して削除します。
次の例は、Simple Message Queue (formerly MNS) SDK がメッセージを正常に受信して削除したときの出力を示しています。
message handle: 519xxx...AgMA==
message body:
{"payload":"eyJsYXN0xxx...IiwiY2xpZW5xxx...","topic":"/as/mqtt/status/xxx/device1","messageid":15xxx,"timestamp":1661158432}
message id: 51xxx...C49
message dequeue count:1
delete message successfully.