物聯網平臺提供的設備影子功能,用于緩存設備上報的狀態和下發的指令。設備在線時,可以直接獲取物聯網平臺指令;設備離線后,再次上線可以主動獲取物聯網平臺的指令。本文介紹通過配置C Link SDK,設備實現影子功能。
前提條件
背景信息
- 設備影子是保存在物聯網平臺上的JSON文檔,用于緩存設備上報屬性(
reported
)數據和云上應用期望屬性(desired
)數據。更多信息,請參見設備影子概覽。
- 設備影子的JSON格式表達方法,請參見設備影子JSON詳解。
- 設備影子的數據流轉過程,請參見設備影子數據流。
使用流程
如下功能時序圖,以設備的應用程序demos/shadow_basic_demo.c
為例,介紹設備影子的使用流程。
步驟一:設備初始化
創建設備句柄,完成設備建連。
static void* demo_device_init(char *product_key, char *device_name, char *device_secret, char *host, uint16_t port)
{
int32_t res = STATE_SUCCESS;
/* 創建設備 */
void *device = aiot_device_create(product_key, device_name);
....
....
res = aiot_device_connect(device);
....
....
return device;
}
步驟二:設置設備影子模塊回調函數
/* 設置設備影子模塊回調函數 */
aiot_device_shadow_set_callback(device, demo_shadow_recv_callback, NULL);
步驟三:上報狀態到設備影子
使用如下示例代碼上報狀態到影子。
/* 更新設備影子中的reported值, 同時將version重置為0 */
aiot_device_shadow_update(device, "{\"LightSwitch\":1}", 0);
參數說明
參數 | 說明 |
| 設備句柄。 |
| 上報的影子屬性狀態。 |
| 設備影子的目標版本,版本號會隨著更新影子增加。 |
步驟四:應用程序更新期望狀態
接收應用狀態。
/* 當設備在線時, 若用戶應用程序調用云端API主動更新設備影子, 設備便會收到此消息 */ case 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)control->version); } break;
上報最新狀態。
/* 更新設備影子中的reported值, 同時將version重置為0 */ aiot_device_shadow_update(device, "{\"LightSwitch\":1}", 0);
設備清除期望屬性。
/* 清除設備影子中的desired值, 同時將version設置為1 */ aiot_device_shadow_clean_desired(device, 1);
步驟五:獲取設備影子屬性
/* 發送請求拉取設備影子, 設備影子將在demo_shadow_recv_callback回調函數中返回 */
aiot_device_shadow_get(device);
步驟六:刪除設備影子屬性
/* 刪除設備影子中特定的reported值, 同時將version設置為2 */
aiot_device_shadow_delete_reported(device, "{\"LightSwitch\":\"null\"}", 2);
步驟七:設備反初始化
/* 斷開設備連接,并回收設備資源 */
demo_device_deinit(device);
文檔內容是否對您有幫助?