本文以C Link SDK中的Demo檔案./demos/devinfo_posix_demo.c為例,介紹如何調用Link SDK的API,向物聯網平台,上報或刪除裝置標籤。
背景資訊
步驟一:初始化
添加標頭檔。
…… …… #include "aiot_devinfo_api.h"
配置底層依賴和日誌輸出。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);
調用aiot_devinfo_init,建立
Devinfo
用戶端執行個體,並初始化預設參數。devinfo_handle = aiot_devinfo_init(); if (devinfo_handle == NULL) { demo_mqtt_stop(&mqtt_handle); printf("aiot_devinfo_init failed\n"); return -1; }
步驟二:配置功能
調用aiot_devinfo_setopt,配置以下功能。
關聯MQTT串連的控制代碼。
重要配置裝置標籤功能參數前,請確保已配置裝置認證資訊等相關參數。具體操作,請參見MQTT配置串連參數。
範例程式碼:
aiot_devinfo_setopt(devinfo_handle, AIOT_DEVINFOOPT_MQTT_HANDLE, mqtt_handle);
相關參數:
配置項
樣本
說明
AIOT_DEVINFOOPT_MQTT_HANDLE
mqtt_handle
裝置標籤。
配置訊息回調。
範例程式碼:
aiot_devinfo_setopt(devinfo_handle, AIOT_DEVINFOOPT_RECV_HANDLER, (void *)demo_devinfo_recv_handler);
相關參數:
配置項
樣本值
說明
AIOT_DEVINFOOPT_RECV_HANDLER
demo_devinfo_recv_handler
接收到裝置標籤相關訊息時,調用該函數。
配置狀態監控。
定義狀態監控回呼函數。
您可以參考以下內容,編寫回呼函數的處理邏輯:
如果上報標籤失敗,會返回以下事件類型:
事件類型
說明
AIOT_DEVINFOEVT_INVALID_DEVINFO
收到的應答中,裝置資訊非法,無法擷取ProductKey和DeviceName。
AIOT_DEVINFOEVT_INVALID_RESPONSE
收到的應答中欄位不合法。
AIOT_DEVINFOEVT_INVALID_RESPONSE_FORMAT
收到的應答中欄位格式錯誤。
範例程式碼僅做列印處理,您可根據業務需要編寫處理邏輯。
void demo_devinfo_event_handler(void *handle, const aiot_devinfo_event_t *event, void *userdata) { switch (event->type) { case AIOT_DEVINFOEVT_INVALID_DEVINFO: { printf("AIOT_DEVINFOEVT_INVALID_DEVINFO\n"); } break; case AIOT_DEVINFOEVT_INVALID_RESPONSE: { printf("AIOT_DEVINFOEVT_INVALID_RESPONSE\n"); } break; case AIOT_DEVINFOEVT_INVALID_RESPONSE_FORMAT: { printf("AIOT_DEVINFOEVT_INVALID_RESPONSE_FORMAT\n"); } break; default: { } } }
配置狀態監控的回呼函數。
範例程式碼:
aiot_devinfo_setopt(devinfo_handle, AIOT_DEVINFOOPT_EVENT_HANDLER, (void *)demo_devinfo_event_handler);
相關參數:
配置項
樣本值
說明
AIOT_DEVINFOOPT_EVENT_HANDLER
demo_devinfo_event_handler
當裝置串連狀態發生變化時,根據該回呼函數定義的處理邏輯,執行對應的處理。
步驟三:更新標籤
調用aiot_devinfo_send,根據上一步配置的參數,向物聯網平台發送更新標籤的請求。
發送請求時,需注意:
更新標籤訊息的資料結構類型為aiot_devinfo_msg_t,是
aiot_devinfo_send()
的入參。更新標籤訊息的類型為AIOT_DEVINFO_MSG_UPDATE。
樣本訊息內容說明:
上報的訊息
對應的Alink格式
說明
[ { "attrKey": "testKey", "attrValue": "testValue" } ]
{ "id": "123", "version": "1.0", "sys":{ "ack":0 }, "params": [ { "attrKey": "testKey", "attrValue": "testValue" } ], "method": "thing.deviceinfo.update" }
更新標籤的訊息的內容為JSON格式,是Alink格式資料中params的值。詳細說明,請參見上報標籤資訊。
範例程式碼更新標籤的資訊為
testKey: testValue
。
{ aiot_devinfo_msg_t devinfo_update; char *update = "[{\"attrKey\":\"testKey\",\"attrValue\":\"testValue\"}]"; memset(&devinfo_update, 0, sizeof(aiot_devinfo_msg_t)); devinfo_update.product_key = product_key; devinfo_update.device_name = device_name; devinfo_update.type = AIOT_DEVINFO_MSG_UPDATE; devinfo_update.data.update.params = update; res = aiot_devinfo_send(devinfo_handle, &devinfo_update); if (res < STATE_SUCCESS) { aiot_devinfo_deinit(&devinfo_handle); demo_mqtt_stop(&mqtt_handle); return -1; } printf("aiot_devinfo_send update msg id: %d\n", res); }
物聯網平台接收到請求訊息後,更新裝置標籤,並返回應答報文。
裝置接收應答報文後,觸發回呼函數
demo_devinfo_recv_handler
,並執行對應的應答處理。您可以參考以下內容,編寫回呼函數的處理邏輯:
應答報文的資料結構類型為aiot_devinfo_recv_t,是回呼函數的入參。
應答報文訊息的類型為AIOT_DEVINFORECV_GENERIC_REPLY。
範例程式碼僅做列印處理。
void demo_devinfo_recv_handler(void *handle, const aiot_devinfo_recv_t *packet, void *userdata) { switch (packet->type) { /* 物聯網平台對devinfo訊息的應答 */ case AIOT_DEVINFORECV_GENERIC_REPLY: { printf("pk: %s, dn: %s, code: %d, msg id: %d, data: %.*s, message: %.*s\n", packet->product_key, packet->device_name, packet->data.generic_reply.code, packet->data.generic_reply.msg_id, packet->data.generic_reply.data_len, packet->data.generic_reply.data, packet->data.generic_reply.message_len, packet->data.generic_reply.message); } break; default: { } } }
(可選)步驟四:刪除標籤
裝置上報標籤後,調用aiot_devinfo_send,向物聯網平台發送一條刪除標籤的請求。
發送請求時,需注意:
刪除標籤訊息的資料結構類型為aiot_devinfo_msg_t,是
aiot_devinfo_send()
的入參。刪除標籤訊息的類型為AIOT_DEVINFO_MSG_DELETE。
樣本訊息內容說明:
上報的訊息
對應的Alink格式
說明
{ "attrKey": "testKey" }
{ "id": "123", "version": "1.0", "sys":{ "ack":0 }, "params": [ { "attrKey": "testKey", } ], "method": "thing.deviceinfo.update" }
刪除標籤的訊息的內容為JSON格式,是Alink格式資料中params的值。詳細說明,請參見刪除標籤資訊。
範例程式碼刪除的標籤為
testKey
。{ aiot_devinfo_msg_t devinfo_delete; char *delete = "[{\"attrKey\":\"testKey\"}]"; memset(&devinfo_delete, 0, sizeof(aiot_devinfo_msg_t)); devinfo_delete.product_key = product_key; devinfo_delete.device_name = device_name; devinfo_delete.type = AIOT_DEVINFO_MSG_DELETE; devinfo_delete.data.delete.params = delete; res = aiot_devinfo_send(devinfo_handle, &devinfo_delete); if (res < STATE_SUCCESS) { aiot_devinfo_deinit(&devinfo_handle); demo_mqtt_stop(&mqtt_handle); return -1; } printf("aiot_devinfo_send delete msg id: %d\n", res); }
物聯網平台接收到請求訊息後,刪除對應的標籤,並返回應答報文。
裝置接收應答報文後,觸發回呼函數demo_devinfo_recv_handler,並執行對應的應答處理。
具體操作,請參見處理應答報文。
步驟五:退出程式
調用aiot_devinfo_deinit,銷毀Devinfo
用戶端執行個體,釋放資源。
res = aiot_devinfo_deinit(&devinfo_handle);
if (res < STATE_SUCCESS) {
demo_mqtt_stop(&mqtt_handle);
printf("aiot_devinfo_deinit failed: -0x%04X\n", -res);
return -1;
}