物模型是阿里云物聯網平臺為產品定義的數據模型,本文介紹如何通過物模型功能,上報設備屬性及事件、設置屬性、調用服務等。
前提條件
使用流程
如下功能時序圖,以設備的應用程序./demos/data_model_basic_demo.c
為例,介紹物模型的基礎使用流程。更多API的詳細信息,請參考aiot_dm_api.h
。
步驟1: 初始化設備
創建設備句柄,完成設備建連。
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);
if (device == NULL) {
printf("device create failed\n");
return NULL;
}
/* 設置設備密鑰 */
aiot_device_set_device_secret(device, device_secret);
/* 連接配置參數初始化 */
aiot_linkconfig_t* config = aiot_linkconfig_init(protocol);
/* 設置服務器的host、port */
aiot_linkconfig_host(config, host, port);
/* 設置設備連接參數 */
aiot_device_set_linkconfig(device, config);
/* 設備建連 */
res = aiot_device_connect(device);
if (res < STATE_SUCCESS) {
/* 嘗試建立連接失敗, 銷毀MQTT實例, 回收資源 */
aiot_linkconfig_deinit(&config);
aiot_device_delete(&device);
printf("aiot_device_connect failed: -0x%04X\n\r\n", -res);
return NULL;
}
/* 建連成功返回設備對象 */
aiot_linkconfig_deinit(&config);
return device;
}
步驟2: 上報屬性
屬性上報一般用于上報設備的狀態,如下示例表示燈是關閉狀態。
/* 屬性上報示例 */
char *property_params = "{\"LightSwitch\": 0}";
aiot_device_dm_property_post(device_client, property_params, 1);
步驟3: 設置屬性
設備接收到設置屬性消息后,會執行回調函數返回設置屬性消息,消息類型為:AIOT_DMRECV_PROPERTY_SET
,如下示例中設置屬性僅做打印處理。
/* 云端->設備:屬性設置消息處理示例, 示例只做打印處理 */
static void demo_dm_msg_property_set_callback(void *device, const aiot_dm_msg_t *dm_msg, void *userdata)
{
printf("demo_dm_msg_property_set_callback params = %.*s\r\n",
dm_msg->data.property_set.params_len,
dm_msg->data.property_set.params);
/* TODO 演示同步回復 */
char *reply_data = "{}";
aiot_device_dm_propertyset_reply(device, dm_msg->context, 200, reply_data);
/* TODO 演示異步回復[不在回調函數中回復], 需要備份消息的上下文用于回復 */
/*
void *context = aiot_dm_msg_context_clone(dm_msg->context);
aiot_device_dm_propertyset_reply(device, dm_msg->context, 200, reply_data);
aiot_dm_msg_context_free(context);
*/
}
步驟4: 上報事件
事件一般包含需要被外部感知和處理的信息、告警和故障,如下示例中模擬上報一個錯誤,錯誤碼為-1。
char *event_id = "Error";
char *event_params = "{\"ErrorCode\": -1}";
aiot_device_dm_event_post(device_client, event_id, event_params, 1);
步驟5: 調用服務
服務為設備提供外部調用的指令或方法,如打開電燈可作為一個服務調用實現。如下示例服務調用回調,僅做打印處理。
/* 云端->設備:服務調用消息處理示例, 示例只做打印處理 */
static void demo_dm_msg_service_invoke_callback(void *device, const aiot_dm_msg_t *dm_msg, void *userdata)
{
printf("demo_dm_msg_service_invoke_callback service_id %s, params = %.*s\r\n",
dm_msg->data.service_invoke.service_id,
dm_msg->data.service_invoke.params_len,
dm_msg->data.service_invoke.params);
/* TODO 演示同步回復 */
char *reply_data = "{}";
aiot_device_dm_service_reply(device, dm_msg->context, dm_msg->data.service_invoke.service_id, 200, reply_data);
/* TODO 演示異步回復[不在回調函數中回復], 需要備份消息的上下文用于回復 */
/*
void *context = aiot_dm_msg_context_clone(dm_msg->context);
aiot_device_dm_propertyset_reply(device, dm_msg->context, 200, reply_data);
aiot_dm_msg_context_free(context);
*/
}
步驟6: 反初始化設備
/* 斷開設備連接,并回收設備資源 */
demo_device_deinit(device_client);
文檔內容是否對您有幫助?