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

IoT Platform:例:

最終更新日:Apr 09, 2025

ゲートウェイを使用してサブデバイスをIoT Platformに接続します。. /demos/fota_posix_demo.cサンプルコードファイルを使用します。

背景情報

  • ゲートウェイとサブデバイスの詳細については、「概要」をご参照ください。
  • ゲートウェイ IoT Platformとの永続的な接続を維持する必要があります。 ゲートウェイの接続方法は、直接接続されたデバイスの接続方法と同じです。 詳細については、「概要」をご参照ください。

    この例で使用するゲートウェイの認証情報を次の表に示します。

    ProductKeyデバイス名DeviceSecret
    a18wP ******LightSwitchGWuwMTmVAMnGGHaAkqmeDY6cHxxB ******

ステップ1: クライアントの初期化

  1. ヘッダーファイルを追加
    ...
    ...
    
    # include "aiot_subdev_api.h" 

  2. 基になる依存関係を追加し、ログ出力機能を設定します。

    aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb); 
  3. aiot_subdev_init操作を呼び出して、subdevを作成します
    subdev_handle = aiot_subdev_init();
        if (subdev_handle == NULL) {
            printf("aiot_subdev_init failed\n");
            demo_mqtt_stop(&mqtt_handle);
            return -1;
        }

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

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

  1. MQTT接続ハンドルとの関連付け
  2. メッセージコールバックの設定
  1. MQTT接続ハンドルとの関連付け.
    重要 ゲートウェイとサブデバイスに関連するパラメーターを設定する前に、ゲートウェイの認証情報が設定されていることを確認してください。 詳細については、「」をご参照ください。
    • aiot_subdev_setopt(subdev_handle, AIOT_SUBDEVOPT_MQTT_HANDLE, mqtt_handle);
    • パラメーター説明
      AIOT_SUBDEVOPT_MQTT_HANDLEmqtt_handleMQTT接続を確立する必要があります。 このパラメータは、MQTT接続ハンドルに関連付けるために使用されます。

  2. メッセージのコールバックを設定します。
    1. メッセージコールバック関数の指定
      • aiot_subdev_setopt(subdev_handle, AIOT_SUBDEVOPT_RECV_HANDLER, demo_subdev_recv_handler);
      • パラメーター説明
        AIOT_SUBDEVOPT_RECV_HANDLERdemo_subdev_recv_handlerゲートウェイがIoT Platformからメッセージを受信すると、必要な操作を実行するためにコールバックが呼び出されます。

    2. メッセージコールバック関数
      の定義
      メッセージのAlinkデータ形式の詳細については、「トポロジ関係の管理」および「サブデバイスの接続または切断」をご参照ください。
      void demo_subdev_recv_handler(void * handle, const aiot_subdev_recv_t * packet, void * user_data)
      {
          switch (packet->type) {
              case AIOT_SUBDEVRECV_TOPO_ADD_REPLY:
              case AIOT_SUBDEVRECV_TOPO_DELETE_REPLY:
              case AIOT_SUBDEVRECV_TOPO_GET_REPLY:
              case AIOT_SUBDEVRECV_BATCH_LOGIN_REPLY:
              case AIOT_SUBDEVRECV_BATCH_LOGOUT_REPLY:
              case AIOT_SUBDEVRECV_SUB_REGISTER_REPLY:
              case AIOT_SUBDEVRECV_PRODUCT_REGISTER_REPLY: {
                  printf("msgid : % d\n", packet->data.generic_reply.msg_id);
                  printf("code : % d\n", packet->data.generic_reply.code);
                  printf("プロダクトキー: % s\n", packet->data.generic_reply.product_key);
                  printf("device name : % s\n", packet->data.generic_reply.device_name);
                  printf("message : % s\n", (packet->data.generic_reply.message == NULL)?("NULL"):( packet->data.generic_reply.message));
                  printf("data : % s\n", packet->data.generic_reply.data);
              }
              break;
              case AIOT_SUBDEVRECV_TOPO_CHANGE_NOTIFY: {
                  printf("msgid : % d\n", packet->data.generic_notify.msg_id);
                  printf("プロダクトキー: % s\n", packet->data.generic_notify.product_key);
                  printf("device name : % s\n", packet->data.generic_notify.device_name);
                  printf("params : % s\n", packet->data.generic_notify.params);
              }
              break;
              default: {
      
              }
          }
      }

ステップ3: トポロジ関係を追加する

  1. サブデバイスの認証情報を取得します。
    サブデバイスのプロダクトとデバイスを作成します。 プロダクトを作成するときに、ノードタイプをゲートウェイサブデバイスに設定します。 この例では、以下の製品とサブデバイスが作成されています。
    製品名ProductKeyデバイス名DeviceSecretProductSecret
    LightSwitchSDa13FN ******LightSwitch_SubDev_01768XBgQwgOakz3K4uhOiLeeh9x ******y7GSILD480 ******
    LightSwitch_SubDev_02iwTZrbjbgNVChfuJkihjE5asek ******
    LightSwitch_SubDev_03fdutq35iKMYdcWWBuIINY26hsN ******
    LightSwitch_SubDev_04HCKv50YqgwdKhy5cE0Vz4aydmK ******

    詳細については、「プロダクトの作成」および「デバイスの作成」をご参照ください。

  2. サブデバイスの認証情報を示すg_subdev変数を定義します。
    この例では、4つのサブデバイスの認証情報が提供される。 実際のビジネスシナリオでは、サブデバイスの認証情報を取得するためのコードを記述し、メソッドを定義する必要があります。 サンプルコード:
    • ゲートウェイは、接続されたサブデバイスを発見した後、ゲートウェイとサブデバイスとの間で定義されたプロトコルに基づいて、サブデバイスの証明書を取得することができる。 プロトコルは、ゲートウェイのプロバイダおよびサブデバイスのプロバイダによって定義される。
    • ゲートウェイのプロバイダは、ゲートウェイがサブデバイスに関する証明書情報をプリセットすることを可能にする構成方法を提供する。 この機能は、ゲートウェイのプロバイダによって実装される。
    aiot_subdev_dev_t g_subdev[] = {
        {
            "a13FN ******" 、
            "LightSwitch_SubDev_01" 、
            "768XBgQwgOakz3K4uhOiLeeh9x *******" 、
            "y7GSILD480 ******"
        },
        {
            "a13FN ******" 、
            "LightSwitch_SubDev_02" 、
            "iwTZrbjbgNVChfuJkihjE5asek *******" 、
            "y7GSILD480 ******"
        },
        {
            "a13FN ******" 、
            "LightSwitch_SubDev_03" 、
            "fdutq35iKMYdcWWBuIINY26hsN *******" 、
            "y7GSILD480 ******"
        },
        {
            "a13FN ******" 、
            "LightSwitch_SubDev_04" 、
            "HCKv50YqgwdKhy5cE0Vz4aydmK *******" 、
            "y7GSILD480 ******"
        }
    };
  3. aiot_subdev_send_topo_add操作を呼び出して、サブデバイスとゲートウェイの間にトポロジ関係を追加します。 リクエストがIoT Platformに送信されます。
    res = aiot_subdev_send_topo_add(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
        if (res < STATE_SUCCESS) {
            printf("aiot_subdev_send_topo_add failed, res: -0x % 04X\n", -res);
            aiot_subdev_deinit(&subdev_handle);
            demo_mqtt_stop(&mqtt_handle);
            return -1;
        }
  4. オプション: ゲートウェイがIoT Platformからプロキシとしてメッセージを受信する必要がない場合は、aiot_subdev_send_topo_delete操作を呼び出して、サブデバイスとゲートウェイ間のトポロジ関係を削除します。
    aiot_subdev_send_topo_delete(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
         if (res < STATE_SUCCESS) {
             printf("aiot_subdev_send_topo_delete failed, res: -0x % 04X\n", -res);
             aiot_subdev_deinit(&subdev_handle);
             demo_mqtt_stop(&mqtt_handle);
             return -1;
         }

ステップ4: サブデバイスをIoT Platformに接続する

  1. aiot_subdev_send_batch_login操作を呼び出して、1つ以上のサブデバイスをIoT Platformに接続します。 サブデバイスがIoT Platformに接続されると、サブデバイスのステータスはオンラインに変わります。
    aiot_subdev_send_batch_login(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
        if (res < STATE_SUCCESS) {
            printf("aiot_subdev_send_batch_login failed, res: -0x % 04X\n", -res);
            aiot_subdev_deinit(&subdev_handle);
            demo_mqtt_stop(&mqtt_handle);
            return -1;
        }
  2. オプション: サブデバイスを切断する必要がある場合は、aiot_subdev_send_batch_logout操作を呼び出して切断リクエストを送信します。 IoT Platformがリクエストを受信すると、IoT Platformは接続を終了します。 次に、サブデバイスのステータスがOfflineに変わります。
    重要 IoT Platformは、サブデバイスのステータスをオフラインに更新します。 この場合、ゲートウェイは、IoT Platformがサブデバイスに送信するメッセージを受信しなくなります。
    aiot_subdev_send_batch_logout(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
         if (res < STATE_SUCCESS) {
             printf("aiot_subdev_send_batch_logout failed, res: -0x % 04X\n", -res);
             aiot_subdev_deinit(&subdev_handle);
             demo_mqtt_stop(&mqtt_handle);
             return -1;
         }
IoT Platformがサブデバイスに送信するメッセージは、サブデバイスのオンラインステータスに基づいて処理されます。
  • サブデバイスがオフラインの場合、QoS 0メッセージは破棄されます。
  • サブデバイスがオンラインの場合、IoT Platformはゲートウェイにメッセージを送信します。 次に、ゲートウェイは、メッセージをサブデバイスに転送する。

ステップ5: トピックを購読する

サブデバイスがIoT Platformに接続された後、aiot_mqtt_sub操作を呼び出してトピックをサブスクライブできます。 その後、サブデバイスは、トピックを使用することによってメッセージを受信することができる。

重要 トピックを指定する場合は、サブデバイスとゲートウェイのProductKeyDeviceNameを区別します。
  •     {
            char * sub_topic = "/a13FN ******/LightSwitch_SubDev_01/user/get";
    
            res = aiot_mqtt_sub(mqtt_handle, sub_topic, NULL, 1, NULL);
            if (res < 0) {
                printf("aiot_mqtt_sub failed, res: -0x % 04X\n", -res);
                return -1;
            }
        }
  • パラメーター説明
    sub_topic/a13FN ******/LightSwitch_SubDev_01/user/get
    • a1oGs ****** は、サブデバイスのProductKeyを示します。
    • LightSwitch_SubDev_01は、サブデバイスのDeviceNameを示します。

    この例では、デフォルトのカスタムトピックが指定されています。

    詳細については、「トピック」をご参照ください。

ステップ6: サブデバイスからメッセージを公開する

aiot_mqtt_pub操作を呼び出して、指定したトピックにメッセージを送信します。

  •      {
            char * pub_topic = "/a13FN ******/LightSwitch_SubDev_01/user/update";
            char * pub_payload = "{\" id\":\" 1\",\" version\":\" 1.0\",\" params\":{\" LightSwitch\":0}";
    
            res = aiot_mqtt_pub(mqtt_handle, pub_topic, (uint8_t *)pub_payload, (uint32_t)strlen(pub_payload), 0);
            if (res < 0) {
                printf("aiot_mqtt_sub failed, res: -0x % 04X\n", -res);
                return -1;
            }
        }
  • パラメーター説明
    pub_topic /a13FN ******/LightSwitch_SubDev_01 /ユーザー /更新発行権限を持つトピック。
    • a1oGs ****** は、サブデバイスのProductKeyを示します。
    • LightSwitch_SubDev_01は、サブデバイスのDeviceNameを示します。
    この例では、デフォルトのカスタムトピックが指定されています。

    詳細については、「トピック」をご参照ください。

    pub_payload{\"id\":\"1\",\"version\" \"1.0\",\"params\" :{\ "LightSwitch\":0}}

    デバイスがIoT Platformに送信するメッセージの内容。

    この例では、カスタムトピックが使用されています。 カスタムメッセージ形式を指定できます。

    詳細については、「データ形式」をご参照ください。

ステップ7: ゲートウェイを切断する

説明

MQTT接続は、永続的に接続されたままのデバイスに適用されます。 IoT Platformからデバイスを手動で切断できます。

この例では、メインスレッドを使用してパラメータを設定し、接続を確立します。 接続が確立されたら、メインスレッドを一時停止できます。

aiot_mqtt_disconnect操作を呼び出して、デバイスをIoT Platformから切断します。

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

ステップ8:

aiot_subdev_deinit操作を呼び出して、subdevを破棄する

res = aiot_subdev_deinit(&subdev_handle);
    if (res < STATE_SUCCESS) {
        printf("aiot_subdev_deinit failed: -0x % 04X\n", res);
    }

次のステップ

サンプルコードファイルを設定したら、ファイルをコンパイルして実行可能ファイルを生成します。この例では、。/output/subdev-basic-demo実行ファイルが生成されます。 詳細については、「コンパイルと実行」をご参照ください。