ゲートウェイを使用してサブデバイスをIoT Platformに接続します。. /demos/fota_posix_demo.cサンプルコードファイルを使用します。
背景情報
ステップ1: クライアントの初期化
- ヘッダーファイルを追加
... ... # include "aiot_subdev_api.h" 基になる依存関係を追加し、ログ出力機能を設定します。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);- 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操作を呼び出して、次の項目を設定します。
- MQTT接続ハンドルとの関連付け.重要 ゲートウェイとサブデバイスに関連するパラメーターを設定する前に、ゲートウェイの認証情報が設定されていることを確認してください。 詳細については、「例」をご参照ください。
-
aiot_subdev_setopt(subdev_handle, AIOT_SUBDEVOPT_MQTT_HANDLE, mqtt_handle); パラメーター 例 説明 AIOT_SUBDEVOPT_MQTT_HANDLE mqtt_handle MQTT接続を確立する必要があります。 このパラメータは、MQTT接続ハンドルに関連付けるために使用されます。
-
- メッセージのコールバックを設定します。
- メッセージコールバック関数の指定
-
aiot_subdev_setopt(subdev_handle, AIOT_SUBDEVOPT_RECV_HANDLER, demo_subdev_recv_handler); パラメーター 例 説明 AIOT_SUBDEVOPT_RECV_HANDLER demo_subdev_recv_handler ゲートウェイがIoT Platformからメッセージを受信すると、必要な操作を実行するためにコールバックが呼び出されます。
-
- メッセージコールバック関数
の定義メッセージの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: トポロジ関係を追加する
- サブデバイスの認証情報を取得します。 サブデバイスのプロダクトとデバイスを作成します。 プロダクトを作成するときに、ノードタイプをゲートウェイサブデバイスに設定します。 この例では、以下の製品とサブデバイスが作成されています。
製品名 ProductKey デバイス名 DeviceSecret ProductSecret LightSwitchSD a13FN ****** LightSwitch_SubDev_01 768XBgQwgOakz3K4uhOiLeeh9x ****** y7GSILD480 ****** LightSwitch_SubDev_02 iwTZrbjbgNVChfuJkihjE5asek ****** LightSwitch_SubDev_03 fdutq35iKMYdcWWBuIINY26hsN ****** LightSwitch_SubDev_04 HCKv50YqgwdKhy5cE0Vz4aydmK ****** - サブデバイスの認証情報を示す
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 ******" } }; - 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; } - オプション: ゲートウェイが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に接続する
- 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; } - オプション: サブデバイスを切断する必要がある場合は、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; }
- サブデバイスがオフラインの場合、
QoS 0メッセージは破棄されます。 - サブデバイスがオンラインの場合、IoT Platformはゲートウェイにメッセージを送信します。 次に、ゲートウェイは、メッセージをサブデバイスに転送する。
ステップ5: トピックを購読する
サブデバイスがIoT Platformに接続された後、aiot_mqtt_sub操作を呼び出してトピックをサブスクライブできます。 その後、サブデバイスは、トピックを使用することによってメッセージを受信することができる。
{ 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実行ファイルが生成されます。 詳細については、「コンパイルと実行」をご参照ください。