このトピックでは、Link SDK for CのAPI操作を呼び出してMessage Queuing Telemetry Transport (MQTT) リクエストをIoT Platformに送信し、デバイスを動的に登録し、デバイスのアクティブ化に必要な検証情報を取得します。 この例では、という名前のサンプルコードファイルを示します。/demos/dynregmq_basic_demo.c が使用されている。
背景情報
SDKをカスタマイズするときは、SDKのカスタマイズページで [デバイス認証スキーム] を [動的登録] に設定します。 このトピックのサンプルコードファイルを使用する前に、[概要] トピックの内容に精通していることを確認してください。
手順1: SDKの初期化
ヘッダーファイルを追加します。
を含む# 「aiot_state_api.h」を含める # 「aiot_sysdep_api.h」を含む # 「aiot_dynregmq_api.h」基になる依存関係を追加し、ログ出力機能を設定します。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);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操作を呼び出して、次の項目を設定します。
詳細については、「MQTTベースの動的登録」をご参照ください。
接続パラメーターの設定
サンプルコード:
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.comskip_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) とすることができる。
メッセージコールバックの設定
メッセージコールバック関数を指定します。
サンプルコード:
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操作が呼び出されると、操作から取得した値が返されます。
メッセージコールバック関数を定義します。
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の代わりにClientId、UserName、およびパスワードをデバイスに発行します。
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);