この手順で、デバイスがクラウドにデータを送信でき、クラウドアプリケーションが MNS キューをモニタリングしてデバイスからメッセージを取得できるようになります。

手順

  1. コンソールでプロダクトのサービスサブスクリプションを設定し、プラットフォームから MNS キューへの自動メッセージ転送を有効にします。
    1. [プロダクト] をクリックし、[表示] をクリックして、作成したプロダクトを表示します。
    2. 左側のナビゲーションウィンドウで、[サブスクリプション][設定]の順にクリックし、[デバイスアップストリーム通知] チェックボックスと [デバイスステータス更新通知]チェックボックスをオンにします。
      • [デバイスアップストリーム通知] オプションは、デバイスから送信されたデータを、プラットフォームが MNS サービスに自動的に転送することを示します。
      • [デバイスステータス更新通知] オプションは、デバイスステータス (オンラインまたはオフライン) が変化したときに、プラットフォームが自動的に MNS サービスに通知をプッシュすることを示します。

    MNS サービスをサブスクライブすると、MNS サービスは中国 (上海) リージョン内のメッセージキューを自動的に作成します。 たとえば、名前がaliyun-iot-a1wmrZPO8o9で、デバイスの productKey が a1wmrZPO8o9とします。

    設定は 1 分後に有効になります。

  2. クラウドアプリケーションは、MNS キューをモニタリングすることによってデバイスデータを受信します。 この例では、クラウドアプリケーションが Java SDK を使用して MNS サービスにアクセスし、 キューモードでトピックをサブスクライブすると仮定します。 このプロセスには次の情報が関連します。
    1. プロジェクトファイル"pom.xml" には、次の依存関係があります。
      <dependency>
                <groupId>com.aliyun.mns</groupId> 
                <artifactId>aliyun-sdk-mns</artifactId>
                <version>1.1.8</version>
      </dependency> 
      							
    2. メッセージを受信するには、次の情報を指定する必要があります。
      CloudAccount account = new CloudAccount ($AccessKeyId, $AccessKeySecret, $AccountEndpoint);
      • AccessKeyId とAccessKeySecret は、API にアクセスするために必要です。 Alibaba Cloud アカウントのアバターをクリックすると、プロファイルからそれらを参照できます。
      • AccountEndpoint は、MNS コンソールで参照できます。 中国 (上海) リージョンを選択し、IoT Platformが作成したメッセージサービスを探し、[エンドポイントの取得] をクリックします。
    3. IoT Message Queue のような情報を指定する必要もあります。以下は例です。
      MNSClient client = account.getMNSClient();
      CloudQueue queue = client.getQueueRef("aliyun-iot-a1wmrZPO8o9"); //Input the queue that is automatically created as the parameter.
      
      
      while (true) {
      //Get messages
      Message popMsg = queue.popMessage(10);  //The timeout for long polling is 10 senconds
      if (popMsg ! = null) {
      System.out.println("PopMessage Body: "
      + popMsg.getMessageBodyAsRawString()); //Get the original messages.
      queue.deleteMessage(popMsg.getReceiptHandle()); //Delete messages from the queue.
      } else {
      System.out.println("Continuing");
      }
      }
    4. MNS キューのモニタリングを開始します。
    MNS キューのモニタリング方法の詳細については、『MNS』をご参照ください。
  3. テストメッセージをアップロードしてサンプルプログラムを実行し、クラウドサービスが MNS キューのモニタリングによりメッセージを受信できることを検証します。
    1. シミュレーションされたデバイスから /a1wmrZPO8o9/cbgiotkJ4O4WW59ivysa/data トピックに、テストメッセージをアップロードします。 たとえば、hello world! というメッセージを送信します。 アップロードするメッセージを編集する必要があり、編集を行うときには、 Linux デバイス上の C SDK で、iotkit-embedded/sample/mqtt/mqtt-example.c パスを使用します。 コード例は次のとおりです。
      #define TOPIC_DATA "/"PRODUCT_KEY"/"DEVICE_NAME"/data"
      /* Initialize topic information */
      memset(&topic_msg, 0x0, sizeof(iotx_mqtt_topic_info_t));
      strcpy(msg_pub, "message: hello world!") ;
      topic_msg.qos = IOTX_MQTT_QOS1;
      topic_msg.retain = 0;
      topic_msg.dup = 0;
      topic_msg.payload = (void *)msg_pub;
      topic_msg.payload_len = strlen(msg_pub);
      EXAMPLE_TRACE("\n publish message: \n topic: %s\n payload: \%s\n", TOPIC_DATA, topic_msg.payload);
      rc = IOT_MQTT_Publish(pclient, TOPIC_DATA, &topic_msg);
      EXAMPLE_TRACE("rc = IOT_MQTT_Publish() = %d", rc);
    2. iotkit-embedded パスを使用し、makeコマンドを実行して、デバイス SDK をコンパイルします。 コマンドは次のとおりです。
      make distclean
      make
    3. iiotkit-embedded/output/release/bin パスを使用して、更新されたサンプルプログラムを実行します。

      送信データの出力ログは次のとおりです。

      mqtt_client|246:: 
      publish message:
      topic: /a1wmrZPO8o9/cbgiotkJ4O4WW59ivysa/data
      payload: message: hello world!
    4. クラウドアプリケーションが上記のメッセージをモニタリングできるかどうかを確認します。 モニタリングに成功した場合、
      • クラウドアプリケーションは次のようなメッセージを受け取ります。
        {
        "messageid":" ", //Message ID
        "messagetype":"status",
        "topic":"/a1wmrZPO8o9/cbgiotkJ4O4WW59ivysa/data",
        "payload": {hello world},
        "timestamp": //the timestamp
        }
        • messageid: IoT Platform によって生成された、サイズが 64 ビットのメッセージ ID。
        • messagetype: 通知、ステータス、アップロードを含むメッセージタイプ。
        • topic: モニタリング対象メッセージのトピック。 トピックのタイプは "messagetype" によって識別されます。 "messagetype" が "status" の場合、空のトピックです。 "messagetype" が "upload" の場合、特定のトピックです。 この例では、トピックは /a1wmrZPO8o9/cbgiotkJ4O4WW59ivysa/data です。
        • payload: Base64 エンコードデータ。 データの型は "messagetype" によって識別されます。 "messagetype" が "status" の場合、IoT Platform が通知を送信することを示します。 "messagetype" が "upload" の場合、デバイスが IoT Platform にデータを公開することを示します。
        • timestamp: Epoch 時刻で表現されるタイムスタンプ
      • 以下はメッセージの例です。
        data=
        {
        "status":"online" (or offline), //the device status
        "productKey":"xxxxxxxxxxx", //In this document, the ProductKey is: a1wmrZPO8o9
        "deviceName":"xxxxxxxxxx", //In this document, the DeviceName: cbgiotkJ4O4WW59ivysa
        "time":"2017-10-11 10:11:12.234", //the time that the notification is sent
        "lastTime":"2017-10-11 10:11:12.123" //the point in time that the device communicates with IoT Platform before the status change.
        "clientIp":"xxx.xxx.xxx.xxx" //the public IP address of the device.
        }