すべてのプロダクト
Search
ドキュメントセンター

IoT Platform:MQTTを介してデバイスを動的に登録する方法の例

最終更新日:Apr 17, 2025

このトピックでは、Link SDK for CのAPI操作を呼び出してMessage Queuing Telemetry Transport (MQTT) リクエストをIoT Platformに送信し、デバイスを動的に登録し、デバイスのアクティブ化に必要な検証情報を取得します。 この例では、という名前のサンプルコードファイルを示します。/demos/dynregmq_basic_demo.c が使用されている

背景情報

SDKをカスタマイズするときは、SDKのカスタマイズページで [デバイス認証スキーム][動的登録] に設定します。 このトピックのサンプルコードファイルを使用する前に、[概要] トピックの内容に精通していることを確認してください。

手順1: SDKの初期化

  1. ヘッダーファイルを追加します。

    # 「aiot_state_api.h」を含める
    # 「aiot_sysdep_api.h」を含む
    # 「aiot_dynregmq_api.h」
    を含む
  2. 基になる依存関係を追加し、ログ出力機能を設定します。

    aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb); 
  3. aiot_dynregmq_init操作を呼び出して、dynregmqという名前のクライアントインスタンスを作成し、デフォルトパラメーターを初期化します。

    dynregmq_handle = aiot_dynregmq_init();
        if (dynregmq_handle == NULL) {
            printf("aiot_dynregmq_init failed\n");
            return -1;
        }

ステップ2: 必要な機能の設定

aiot_dynregmq_setopt操作を呼び出して、次の項目を設定します。

  1. 接続パラメーターの設定

  2. メッセージコールバックの設定

  3. 詳細については、MQTTベースの動的登録」をご参照ください。

  4. 接続パラメーターの設定

    • サンプルコード:

          char * product_key = "a18wP ******";
          char * product_secret = "CpIlPVCXI7 ******";
          char * device_name = "LightSwitch";
          char * mqtt_host = "iot-06 ****** .mqtt.iothub.aliyuncs.com"; 
          uint8_t skip_pre_regist =1;
          ...
          /* サーバーのエンドポイントを指定します。  */
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_HOST, (void *)host);
          /* サーバーのポートを指定します。  */
          aiot_dynregmq_setopt(dynregmq_handle、AIOT_DYNREGMQOPT_PORT、(void *)&port);
          /* デバイスのProductKeyを指定します。  */
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_PRODUCT_KEY, (void *)product_key);
          /* デバイスのProductSecretを指定します。  */
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_PRODUCT_SECRET, (void *)product_secret);
          /* デバイスのDeviceNameを指定します。
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_DEVICE_NAME, (void *)device_name);
          /* 接続のセキュリティ資格情報を指定します。  */
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_NETWORK_CRED, (void *)&cred);
          /* 事前登録不要の検証方法を使用するかどうかを指定します。  */
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_NO_WHITELIST, (void *)&skip_pre_regist);
          ...
          ...
    • パラメータ:

      パラメーター

      概要

      mqtt_host

      iot-06 ****** .mqtt.iothub.aliyuncs.com

      デバイスを接続するエンドポイント。

      形式: ${YourProductKey}.iot-as-mqtt.${YourRegionI d}.aliyuncs.com

      skip_pre_regist

      1

      事前登録不要の検証方法を使用するかどうかを指定します。

      • 0: いいえ

      • 1: はい

      重要

      事前登録および事前登録不要の製品ごとの固有証明書検証方法の詳細については、「製品ごとの固有証明書検証」をご参照ください。

      product_key

      a18wP ******

      IoT Platformコンソールでプロダクトを作成したときに保存したProductKeyとProductSecret。 詳細については、「プロダクトの作成」をご参照ください。

      product_secret

      CpIlPVCXI7 ******

      device_name

      LightSwitch

      デバイスのDeviceNameをします。

      IoT Platformは、デバイスがアクティベーション要求を開始するときにDeviceNameをチェックします。 デバイスから取得できる識別子をDeviceNameとして使用することを推奨します。 識別子は、デバイスのMACアドレス、International Mobile Equipment Identity (IMEI) 番号、またはシリアル番号 (SN) とすることができる。

  5. メッセージコールバックの設定

    1. メッセージコールバック関数を指定します

      • サンプルコード:

        int main(int argc, char * argv[])
        {
            ...
            など。
            aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_RECV_HANDLER, (void *)demo_dynregmq_recv_handler);
            aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_USERDATA, (void *)&demo_info);
            ...
            など。
        }
      • パラメータ:

        パラメーター

        説明

        AIOT_DYNREGMQOPT_RECV_HANDLER

        demo_dynregmq_recv_handler

        メッセージコールバックを設定します。 メッセージが受信されると、コールバックが呼び出されて必要な操作が実行されます。

        AIOT_DYNREGMQOPT_USERDATA

        &demo_info

        コンテキスト。 demo_dynregmq_recv_handler操作が呼び出されると、操作から取得した値が返されます。

    2. メッセージコールバック関数を定義します。

      void demo_dynregmq_recv_handler(void * handle, const aiot_dynregmq_recv_t * packet, void * userdata)
      {
          switch (packet->type) {
              /* TODO: コールバックポイントのパケットパラメータの領域を保存する必要があります。 コールバックが結果を返した後、スペースは解放されます。  */
              case AIOT_DYNREGMQRECV_DEVICEINFO_WL: {
                  if (strlen(packet->data.de viceinfo_wl.device_secret) >= sizeof(demo_devinfo_wl.device_secret)) {
                      break;
                  }
                  /* 事前登録検証方法を使用する場合は、device_secretパラメーターが保持されていることを確認してください。  */
                  memset(&demo_devinfo_wl, 0, sizeof(demo_devinfo_wl_t));
                  memcpy(demo_devinfo_wl.device_secret, packet->data.de viceinfo_wl.device_secret,
                         strlen(packet->data.de viceinfo_wl.device_secret);
              }
              break;
              /* TODO: コールバックポイントのパケットパラメータの領域を保存する必要があります。 コールバックが結果を返した後、スペースは解放されます。  */
              case AIOT_DYNREGMQRECV_DEVICEINFO_NWL: {
                  if (strlen(packet->data.de viceinfo_nwl.clientid) >= sizeof(demo_devinfo_nwl.conn_clientid) | |
                      strlen(packet->data.de viceinfo_nwl.username) >= sizeof(demo_devinfo_nwl.conn_username) | |
                      strlen(packet->data.de viceinfo_nwl.password) >= sizeof(demo_devinfo_nwl.conn_password) {
                      break;
                  }
                  /* 事前登録不要の検証方法を使用する場合は、clientid、ユーザー名、およびパスワードのパラメーターが保持されていることを確認してください。  */
                  memset(&demo_devinfo_nwl, 0, sizeof(demo_devinfo_nwl_t));
                  memcpy(demo_devinfo_nwl.conn_clientid, packet->data.de viceinfo_nwl.clientid,
                         strlen(packet->data.de viceinfo_nwl.clientid);
                  memcpy(demo_devinfo_nwl.conn_username、packet->data.de viceinfo_nwl.username、
                         strlen(packet->data.de viceinfo_nwl.username);
                  memcpy(demo_devinfo_nwl.conn_password、packet->data.de viceinfo_nwl.password、
                         strlen(packet->data.de viceinfo_nwl.password);
              }
              break;
              default: {
              }
              break;
          }
      }

ステップ3: リクエストを送信する

aiot_dynregmq_send_request操作を呼び出して、動的登録リクエストをサーバーに送信します。 パラメーターの設定方法については、「接続パラメーターの設定」をご参照ください。

res = aiot_dynregmq_send_request(dynregmq_handle);
    if (res < STATE_SUCCESS) {
        printf("aiot_dynregmq_send_request failed: -0x % 04X\n", -res);
        return -1;
    }        

ステップ4: 応答を受け取る

登録リクエストが送信されると、IoT Platformはレスポンスを返します。 デバイスは、aiot_dynregmq_recv操作を呼び出して、応答データを受信し、メッセージコールバックを使用してデータを処理します。

res = aiot_dynregmq_recv(dynregmq_handle);
    if (res < STATE_SUCCESS) {
        printf("aiot_dynregmq_recv failed: -0x % 04X\n" 、-res);
        return -1;
    }         

この例では、応答データが印刷される。 返されたデバイス検証情報をオンプレミスに保存するロジックを指定する必要があります。 検証情報は、デバイスがIoT Platformに接続するときに使用されます。

if (skip_pre_regist == 0) {
        printf("device secret: % s\n", demo_devinfo_wl.device_secret);
    } else {
        printf("clientid: % s\n", demo_devinfo_nwl.conn_clientid);
        printf("username: % s\n", demo_devinfo_nwl.conn_username);
        printf("password: % s\n", demo_devinfo_nwl.conn_password);
    }

ステップ5: プログラムを終了する

aiot_dynregmq_deinit操作を呼び出して、dynregmqクライアントインスタンスを削除し、関連するリソースをリリースします。

res = aiot_dynregmq_deinit(&dynregmq_handle);

次のステップ

  • サンプルコードファイルを設定したら、ファイルをコンパイルして実行可能ファイルを生成します。 この例では、。/output/dynregmq-basic-demo実行ファイルが生成されます。

    詳細については、「開発環境の準備」をご参照ください。

  • 実行結果の詳細については、「ログの表示」をご参照ください。

  • デバイスを検証するために事前登録なしの製品ごとの一意証明書検証方法を使用する場合、IoT Platformは、デバイスを検証した後、DeviceSecretの代わりにClientIdUserName、およびパスワードをデバイスに発行します。

    mqtt_basic_demo.cファイルでAIOT_MQTTOPT_USERNAME、AIOT_MQTTOPT_PASSWORD、およびAIOT_MQTTOPT_CLIENTID操作にClientId、UserName、およびPasswordを指定して、デバイスをIoT Platformに接続し、aiot_mqtt_connectを呼び出します。 次のサンプルコードは、上記の操作を実行する方法の例を示しています。

    char * user_name = "demo_user_name";
     char * password = "demo_passwd";
     char * client_id = "demo_client_id";
     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_USERNAME, user_name);
     aiot_mqtt_setopt(mqtt_handle、AIOT_MQTTOPT_PASSWORD、パスワード);
     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_CLIENTID, client_id);
     res = aiot_mqtt_connect(mqtt_handle);