この記事では、Link SDK for C toconnect HTTPS-baseddevicesをIoT Platformで呼び出してメッセージを受信する方法について説明します。 この例では、。/demos/http_basic_demoサンプルコードファイルを使用します。
背景情報
HTTPS接続の詳細については、「概要」をご参照ください。
ステップ1: クライアントの初期化
基になる依存関係を追加し、ログ出力機能であるaiot_http_init操作を設定して、クライアントインスタンスを作成し、デフォルトパラメーターを初期化します。
/* 基になる依存関係をSDKに追加します。 */
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
/* SDKのログ出力機能を設定します。 */
aiot_state_set_logcb(demo_state_logcb);
...
...
/* HTTPSクライアントインスタンスを作成し、デフォルトパラメーターを設定します。 */
http_handle = aiot_http_init(); ステップ2: 必要な機能の設定
aiot_http_setopt操作を呼び出して、次の項目を設定します。
操作のパラメーターの詳細については、「aiot_http_option_t」をご参照ください。
接続パラメータを設定します。
サンプルコード
char * http_host = "iot-as-http.cn-shanghai.aliyuncs.com"; ... aiot_sysdep_network_cred_t cred; char * product_key = "a18wP ******"; char * device_name = "LightSwitch"; char * device_secret = "uwMTmVAMnGGHaAkqmeDY6cHxxB ******"; ... ... /* HTTPSサーバーのドメイン名を設定します。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_HOST, (void *)host); /* サーバーポートを設定します。 */ aiot_http_setopt(http_handle、AIOT_HTTPOPT_PORT、(void *)&port); /* デバイスのセキュリティ資格情報を設定します。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_NETWORK_CRED, &cred); /* デバイスのProductKeyを設定します。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_PRODUCT_KEY, product_key); /* デバイスのDeviceNameを設定します。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_DEVICE_NAME, device_name); /* デバイスのDeviceSecretを設定します。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_DEVICE_SECRET, device_secret);パラメーター:
パラメーター
例
説明
http_host
iot-06z00ax1o ****** .http.iothub.aliyuncs.com
エンドポイント。
Enterprise Editionインスタンス、または7月30、2021日以降にアクティブ化されるパブリックインスタンスを使用している場合は、[インスタンスの詳細] ページでエンドポイントを表示します。 右上隅の [開発設定の表示] をクリックします。 [開発構成] パネルに、エンドポイントが表示されます。
2021年7月30日より前にアクティブ化されたパブリックインスタンスを使用する場合、エンドポイントは
https:// iot-as-http.${YourRegionI d}.aliyuncs.comです。
product_key
a18wP ******
デバイス認証情報。 詳細については、「デバイス検証情報の取得」をご参照ください。
この例では、デバイス固有証明書認証方式が使用されます。
device_name
LightSwitch
device_secret
uwMTmVAMnGGHaAkqmeDY6cHxxB ******
ステータスモニタリングを設定します。
ステータスを監視するコールバックを指定します。
サンプルコード
int main(int argc, char * argv[]) { ... ... /* データが到着したときに呼び出されるコールバックを指定します。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_RECV_HANDLER, demo_http_recv_handler); /* 内部ステータスが変更されたときに呼び出されるコールバックを指定します。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_EVENT_HANDLER, demo_http_event_handler); }パラメーター:
パラメーター
例
説明
AIOT_HTTPOPT_RECV_HANDLER
demo_http_recv_handler
デバイスが応答メッセージを受信すると、コールバックが呼び出されて必要な操作が実行されます。
AIOT_HTTPOPT_EVENT_HANDLER
demo_http_event_handler
トークンが変更されると、トークンの有効性を保証するためにコールバックが呼び出されます。
コールバックを定義してステータスを監視します。
トークンが変更されると、コールバックが呼び出されて必要な操作が実行されます。
void demo_http_event_handler(void * handle, const aiot_http_event_t * event, void * user_data) { int32_t res; /* 期限切れのトークンを処理します。 */ if (event->type == AIOT_HTTPEVT_TOKEN_INVALID) { printf("token invalid, invoke iot_http_auth to get new token\n"); res = aiot_http_auth (ハンドル); printf("aiot_http_auth in callback, res = -0x % 04x\r\n", -res); } }ネットワークメッセージが読み取られると、コールバックが呼び出されて必要な操作が実行されます。 この例では、メッセージが印刷される。 処理ロジックを指定する場合は、次の項目に注意してください。
応答メッセージのパラメーターの詳細については、「HTTPSによる接続の確立」をご参照ください。
受信したメッセージは、AIOT_HTTPRECV_STATUS_CODE、AIOT_HTTPRECV_HEADER、およびAIOT_HTTPRECV_BODYのセクションを含む。 これらのセクションは、ステータスコード、メッセージタイプ、およびメッセージボディをそれぞれ示します。
ビジネスニーズに基づいてステータスコードを処理します。 ステータスコードの詳細については、「HTTPステータスコードのリスト」をご参照ください。
void demo_http_recv_handler(void * handle, const aiot_http_recv_t * packet, void * userdata) { switch (packet->type) { ケースAIOT_HTTPRECV_STATUS_CODE: { /* TODO: 次のコードに注釈が付いていない場合、SDKはメッセージを受信し、404、200、302などのこのコールバックを使用してHTTPSステータスコードを出力します。 */ /* printf("ステータスコード: % d\n", packet->data.status_code.code); * / } break; ケースAIOT_HTTPRECV_HEADER: { /* TODO: 次のコードに注釈が付いていない場合、SDKはメッセージを受信し、Content-Lengthなどのこのコールバックを使用してHTTPSヘッダーを出力します。 */ /* printf("key: % s, value: % s\n", packet->data.header.key, packet->data.header.value); * / } break; /* TODO: IoT PlatformからのHTTPSレスポンスメッセージを処理する必要がある場合は、ロジックを指定します。 この例では、応答メッセージが印刷される。 */ ケースAIOT_HTTPRECV_BODY: { printf("%.* s\r\n", packet->data.body.len, packet->data.body.buffer); } break; default: { } break; } }
ステップ3: 接続の確立
aiot_http_auth操作を呼び出して、IoT Platformに認証リクエストを送信し、トークンを取得します。 パラメーターの指定方法については、「接続パラメーターの設定」をご参照ください。
/* 認証リクエストを開始し、トークンを取得します。 */
res = aiot_http_auth(http_handle);
if (res == 0) {
printf("aiot_http_auth success \r\n");
} else {
/* 認証に失敗した場合は、インスタンスのリソースを解放し、プログラムを終了します。 */
printf("aiot_http_auth failed, res = -0x % 04x\r\n", -res);
aiot_http_deinit(&http_handle);
return -1;
}ステップ4: メッセージを送信
demo_http_post_lightswitch関数でaiot_http_send操作を呼び出して、指定したトピックにメッセージを送信します。
この例では、送信されたメッセージが印刷される。 ビジネスニーズに基づいて
demo_http_post_lightswitch機能をカスタマイズできます。IoT Platformにメッセージを送信するには、サンプルコードの両側の注釈記号を削除する必要があります。
サンプルコード
int32_t demo_http_post_lightswitch(void * handle) { char data[] = "{\" id\":\" 1\",\" version\":\" 1.0\",\" params\":{\" LightSwitch\":0}"; int32_t res; res = aiot_http_send (ハンドル、 "/a1wAf ******/LightSwitch/user/update" 、 (uint8_t *) データ、 strlen (データ); if (res < 0) { printf("aiot_http_send res = -0x % 04X\r\n", -res); return res; } ... ... }パラメーター:
パラメーター
例
説明
data[]
{\"id\":\"1\",\"version\" \"1.0\",\"params\" :{\ "LightSwitch\":0}}
IoT Platformに送信されるメッセージ。
この例では、カスタムトピックが使用されています。 したがって、メッセージ形式をカスタマイズできます。
メッセージ形式の詳細については、「データ形式」をご参照ください。
topic
/a1wAf ******/LightSwitch /ユーザー /アップデート
発行権限を持つトピック。
a18wP ******は、デバイスのProductKeyを示します。LightSwitchは、デバイスのDeviceNameを示します。
デバイスは、このトピックを使用してIoT Platformにメッセージを送信できます。
トピックの詳細については、「トピック」をご参照ください。
ステップ5: 応答を受け取る
メッセージが送信された後、IoT Platformは応答メッセージを返します。 デバイスはaiot_http_recv操作を呼び出してHTTPS応答データを受信し、イベントコールバックを使用してデータを処理します。
res = aiot_http_recv (ハンドル);
if (res >= 0) {
/* サーバーからの応答を受信し、応答コードが0の場合、デバイスデータが送信されます。 */
return 0;
} else {
printf("aiot_http_recv res = -0x % 04X\r\n" 、-res);
return -1;
}ステップ6: Exit the program
aiot_http_deinit操作を呼び出して、HTTPSクライアントインスタンスを破棄し、リソースをリリースします。
aiot_http_deinit(&http_handle);
printf (「通常のリターン \r\nとしてのプログラム終了」);
printf("\r\n");
リターン0;