デバイスシャドウを設定します。、。/demos/shadow_basic_demo.cサンプルコードファイルを使用します。
背景情報
ステップ1: クライアントの初期化
- ヘッダーファイルを追加
を含む... ... # 「aiot_shadow_api.h」 基になる依存関係を追加し、ログ出力機能を設定します。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);- aiot_shadow_init操作を呼び出して、
shadowを作成します。shadow_handle = aiot_shadow_init(); if (shadow_handle == NULL) { printf("aiot_shadow_init failed\n"); return -1; }
ステップ2: 機能の設定
aiot_shadow_setopt操作を呼び出して、次の項目を設定します。
- MQTT接続ハンドルとの関連付け.重要 デバイスシャドウ固有のパラメータを設定する前に、
aiot_shadow_setopt(shadow_handle, AIOT_SHADOWOPT_MQTT_HANDLE, mqtt_handle);パラメーター 例 説明 AIOT_SHADOWOPT_MQTT_HANDLE mqtt_handle MQTT接続を確立する必要があります。 このパラメータは、MQTT接続ハンドルに関連付けるために使用されます。
- メッセージコールバックの設定Configure a message callback
-
aiot_shadow_setopt(shadow_handle, AIOT_SHADOWOPT_RECV_HANDLER, (void *)demo_shadow_recv_handler); パラメーター 例 説明 AIOT_SHADOWOPT_RECV_HANDLER demo_shadow_recv_handler この関数は、デバイスシャドウメッセージが受信されたときに呼び出される。
-
ステップ3: デバイスのステータスを送信する
デバイスがオンラインの場合、デバイスはステータスをそのシャドウに送信できます。 アプリケーションはシャドウからステータスを取得します。
- デバイスがaiot_shadow_send操作を呼び出して、IoT Platformのデバイスシャドウに最新のステータスを送信します。 ステータスを送信するときは、次の項目に注意してください。
- aiot_shadow_msg_tはデータ形式を示します。 このパラメーターは、
aiot_shadow_send()コールバックの入力パラメーターです。 - AIOT_SHADOWMSG_UPDATEはメッセージタイプを示します。
int32_t demo_update_shadow(void * shadow_handle、char * reported_data、int64_tバージョン) { aiot_shadow_msg_tメッセージ; memset(&message, 0, sizeof(aiot_shadow_msg_t)); message.type = AIOT_SHADOWMSG_UPDATE; message.data.update.reported = reported_data; message.data.update.version = version; aiot_shadow_send(shadow_handle, &message) を返します。} - aiot_shadow_msg_tはデータ形式を示します。 このパラメーターは、
- メッセージの内容を指定します。
-
res = demo_update_shadow(shadow_handle, "{\" LightSwitch\":1}", 0); if (res < 0) { printf("demo_delete_shadow_report failed, res = -0x % 04x\r\n", -res); } - サンプルメッセージ:
サンプルメッセージ Alink形式 説明 { "LightSwitch": 1 }{ "method": "update", "state": { "reported": { "LightSwitch": 1 } }, "version": 0 }メッセージの内容はJSON形式です。 コンテンツは、Alinkデータのstateパラメーターで示されます。 詳細については、「デバイスがステータスを送信する」をご参照ください。 この例では、メッセージの内容を次の項目に示します。
LightSwitchプロパティを1に設定します。- バージョン番号を
0に設定します。説明- 後続の操作のバージョン番号をインクリメントする必要があります。 それ以外の場合、IoT Platformはエラーを返します。
- バージョン番号を
-1に設定すると、IoT Platformはデバイスシャドウデータを消去し、バージョン番号を0に更新します。
-
- IoT Platformがメッセージを受信すると、IoT Platformはシャドウファイルを更新します。 その後、IoT Platformはデバイスに応答を返します。
- デバイスが応答を受信した後、
demo_shadow_recv_handlerコールバックが呼び出されます。コールバックの処理ロジックを指定する場合は、次の項目に注意してください。
- aiot_shadow_recv_tはデータ形式を示します。 このパラメーターは、コールバックの入力パラメーターです。
- AIOT_SHADOWRECV_GENERIC_REPLYはメッセージタイプを示します。
- 次の表に、サンプルレスポンスとレスポンスのAlink形式を示します。
例 Alink形式 説明 { "status":"success", "version":0 }{ "method": "reply" 、 "payload": { "status": "success" 、 "version": 0 }, "timestamp": 1626317187 }応答は、Alinkデータ内のpayloadパラメータによって示される。 このサンプル応答は、ステータスが送信されたことを示します。
- この例では、メッセージが印刷される。
void demo_shadow_recv_handler(void * handle, const aiot_shadow_recv_t * recv, void * userdata) { printf("demo_shadow_recv_handler, type = % d, productKey = % s, deviceName = % s\r\n", recv->type、recv->product_key、recv->device_name); switch (recv->type) { case AIOT_SHADOWRECV_GENERIC_REPLY: { const aiot_shadow_recv_generic_reply_t * generic_reply = &recv->data.generic_reply; printf("payload = \" %.* s\"、status = % s、timestamp = % ld\r\n" 、 generic_reply->payload_len, generic_reply->payload、 generic_reply-> ステータス、 (unsigned long)generic_reply-> タイムスタンプ); } …… ... default: break; } }
ステップ4: 目的のプロパティを使用してデバイスのステータスを変更する
デバイスのステータスを変更するには、アプリケーションを使用して、必要なプロパティをデバイスシャドウに送信します。 IoT Platformコンソールにログインして、デバイスシャドウで目的のプロパティを変更することもできます。
- デバイスシャドウで目的のプロパティを更新します。 次の方法を使用できます。
- クラウドアプリケーションを開発し、API操作を呼び出して、必要なプロパティをデバイスシャドウに送信します。 詳細については、「UpdateDeviceShadow」をご参照ください。
- IoT Platformの [デバイスの詳細] ページで、デバイスシャドウの目的のプロパティを変更します。 詳細については、「デバイスシャドウの表示と更新」をご参照ください。
- IoT Platformはシャドウファイルを更新してから、ファイルをデバイスに送信します。
- デバイスがシャドウファイルを受信すると、
demo_shadow_recv_handlerコールバックが呼び出されます。コールバックの処理ロジックを指定する場合は、次の項目に注意してください。重要 デバイスがオフラインの場合は、デバイスがオンラインになった後にデバイスシャドウをリクエストできます。 詳細については、「手順5: デバイスシャドウの要求」をご参照ください。- aiot_shadow_recv_tはデータ形式を示します。 このパラメーターは、コールバックの入力パラメーターです。
- AIOT_SHADOWRECV_CONTROLはメッセージタイプを示します。
- 次の表に、サンプルメッセージとメッセージのAlink形式を示します。
例 Alink形式 説明 { "state": { "desired": { "LightSwitch": 0 } }, "metadata": { "desired": { "LightSwitch": { "timestamp": 1626319658 } } } }{ "method": "control" 、 "payload": { "state": { "desired": { "LightSwitch": 0 } }, "metadata": { "desired": { "LightSwitch": { "timestamp": 1626319658 } } } }, "version": 2, "timestamp": 1469564576 }応答は、Alinkデータ内のpayloadパラメータによって示される。 この例では、
LightSwitchの目的のプロパティが0に設定されています。 - この例では、メッセージが印刷される。
void demo_shadow_recv_handler(void * handle, const aiot_shadow_recv_t * recv, void * userdata) { printf("demo_shadow_recv_handler, type = % d, productKey = % s, deviceName = % s\r\n", recv->type、recv->product_key、recv->device_name); switch (recv->type) { ... ... ケースAIOT_SHADOWRECV_CONTROL: { const aiot_shadow_recv_control_t * control = &recv->data.control; printf("payload = \" %.* s\"、version = % ld\r\n" 、 control->payload_len, control->payload、 (unsigned long) コントロール-> バージョン); } …… ... default: break; } } - デバイスがローカルステータスを更新した後、デバイスは最新のステータスをデバイスシャドウに送信し、応答を処理します。 詳細については、「手順3: デバイスステータスの送信」をご参照ください。
- デバイスは、aiot_shadow_send操作を呼び出して、目的のプロパティを削除します。 目的のプロパティを削除する場合は、次の項目に注意してください。
- aiot_shadow_msg_tはデータ形式を示します。 このパラメーターは、
aiot_shadow_send()コールバックの入力パラメーターです。 - AIOT_SHADOWMSG_CLEAN_DESIREDはメッセージタイプを示します。
- この例では、必要なすべてのプロパティが削除され、バージョン番号が
1に設定されます。
int32_t demo_clean_shadow_desired(void * shadow_handle、int64_tバージョン) { aiot_shadow_msg_tメッセージ; memset(&message, 0, sizeof(aiot_shadow_msg_t)); message.type = AIOT_SHADOWMSG_CLEAN_DESIRED; message.data.clean_desired.version = version; aiot_shadow_send(shadow_handle, &message) を返します。} …… ... res = demo_clean_shadow_desired(shadow_handle, 1); if (res < 0) { printf("demo_clean_shadow_desired failed, res = -0x % 04x\r\n", -res); } - aiot_shadow_msg_tはデータ形式を示します。 このパラメーターは、
- IoT platformが目的のプロパティを削除するリクエストを受信すると、IoT Platformはレスポンスを返します。 この場合、
demo_shadow_recv_handlerコールバックが呼び出されます。詳細については、「応答を処理するためのコールバックの設定」をご参照ください。
ステップ5: デバイスシャドウを要求する
アプリケーションがコマンドを送信するとき、デバイスはオフラインであり得る。 デバイスがオンラインになった後、デバイスはシャドウを要求できます。
- デバイスは、aiot_shadow_send操作を呼び出して、IoT Platformにデバイスシャドウコンテンツを要求します。 AIOT_SHADOWMSG_GETはメッセージタイプを示します。
int32_t demo_get_shadow(void * shadow_handle) { aiot_shadow_msg_tメッセージ; memset(&message, 0, sizeof(aiot_shadow_msg_t)); message.type = AIOT_SHADOWMSG_GET; aiot_shadow_send(shadow_handle, &message) を返します。} …… ... res = demo_get_shadow(shadow_handle); if (res < 0) { printf("demo_get_shadow failed, res = -0x % 04x\r\n", -res); } - IoT Platformがリクエストを受信すると、IoT Platformはレスポンスを返します。 デバイスが応答を受信すると、
demo_shadow_recv_handlerコールバックが呼び出されます。コールバックの処理ロジックを指定する場合は、次の項目に注意してください。- aiot_shadow_recv_tはデータ形式を示します。 このパラメーターは、コールバックの入力パラメーターです。
- AIOT_SHADOWRECV_GET_REPLYはメッセージタイプを示します。
- 次の表に、サンプルレスポンスとレスポンスのAlink形式を示します。
例 Alink形式 説明 { "status": "success" 、 "state": { "reported": { } }, "metadata": { "reported": { } } }{ "method": "reply" 、 "payload": { "status": "success" 、 "state": { "reported": { } }, "metadata": { "reported": { } } }, "version": 5、 "timestamp": 1626320690 }応答は、Alinkデータ内のpayloadパラメータによって示される。 このサンプル応答は、要求が成功したことを示します。 報告されたパラメーターにはデータが含まれていません。
- この例では、メッセージが印刷される。
void demo_shadow_recv_handler(void * handle, const aiot_shadow_recv_t * recv, void * userdata) { printf("demo_shadow_recv_handler, type = % d, productKey = % s, deviceName = % s\r\n", recv->type、recv->product_key、recv->device_name); switch (recv->type) { ... ... case AIOT_SHADOWRECV_GET_REPLY: { const aiot_shadow_recv_get_reply_t * get_reply = &recv->data.get_reply; printf("payload = \" %.* s\"、version = % ld\r\n" 、 get_reply->payload_len, get_reply->payload, (unsigned long)get_reply-> バージョン); } default: break; } }
ステップ6: デバイスシャドウのプロパティを削除する
デバイスが最新のステータスである場合、デバイスはデバイスシャドウ内のプロパティを削除するコマンドを送信できます。
- デバイスは、aiot_shadow_send操作を呼び出して、デバイスシャドウ内の指定されたプロパティを削除します。 リクエストを送信するときは、次の項目に注意してください。
- aiot_shadow_msg_tはデータ形式を示します。 このパラメーターは、
aiot_shadow_send()コールバックの入力パラメーターです。 - AIOT_SHADOWMSG_DELETE_REPORTEDはメッセージタイプを示します。
int32_t demo_delete_shadow_report(void * shadow_handle, char * reported, int64_t version) { aiot_shadow_msg_tメッセージ; memset(&message, 0, sizeof(aiot_shadow_msg_t)); message.type = AIOT_SHADOWMSG_DELETE_REPORTED; message.data.de lete_reporte.reported = reported; message.data.de lete_reporte.version = version; aiot_shadow_send(shadow_handle, &message) を返します。} - aiot_shadow_msg_tはデータ形式を示します。 このパラメーターは、
- 削除するプロパティを指定します。
-
res = demo_delete_shadow_report(shadow_handle, "{\" LightSwitch\":\" null\"}", 2); if (res < 0) { printf("demo_delete_shadow_report failed, res = -0x % 04x\r\n", -res); } - サンプルメッセージ:
例 Alink形式 説明 "{\" LightSwitch\":\" null\"}", 2{ "method": "delete", "state": { "reported": { "LightSwitch": "null" 、 } }, "version": 2 }メッセージの内容はJSON形式です。 コンテンツは、Alinkデータのstateパラメーターで示されます。 詳細については、「デバイスがシャドウプロパティを削除」をご参照ください。 この例では、メッセージの内容を次の項目に示します。
LightSwitchプロパティをnullに設定します。 この値は、デバイスシャドウ内のすべてのデータがクリアされたことを示します。- バージョン番号を
2に設定します。
-
- IoT Platformがリクエストを受信すると、IoT Platformはレスポンスを返します。 デバイスが応答を受信すると、
demo_shadow_recv_handlerコールバックが呼び出されます。詳細については、「応答を処理するためのコールバックの設定」をご参照ください。
ステップ7: プログラムを終了する
aiot_shadow_deinit操作を呼び出して、shadowを破棄します。
res = aiot_shadow_deinit(&shadow_handle);
if (res < STATE_SUCCESS) {
printf("aiot_shadow_deinit failed: -0x % 04X\n" 、-res);
return -1;
}次のステップ
この例では、。/demos/shadow-basic-demo実行ファイルが生成されます。
詳細については、「環境の準備」をご参照ください。
重要- サンプルコードファイルを設定するときに、コードの両側にあるコメント記号 (
/*と*/) を削除し、実際のシナリオに基づいてバージョン番号を変更します。 - バージョン番号を変更するときは、次の項目に注意してください。
- 後続の操作のバージョン番号をインクリメントする必要があります。 それ以外の場合、IoT Platformはエラーを返します。
- バージョン番号を
-1に設定すると、IoT Platformはデバイスシャドウデータを消去し、バージョン番号を0に更新します。
- サンプルコードファイルを設定するときに、コードの両側にあるコメント記号 (
[ログの表示] をします。