TG7100C二次開發——自定義屬性設定與上報
- 訊息發送程序
- 訊息接收處理程序
- 自定義屬性實作方法
最近學習TG7100C的二次開發,遇到了不少問題,最主要的是外設的開發,很多外設功能再aliosthing的上層庫函式中還沒有實作,比如ADC,
此處先對屬性的上報和下發,做一些記錄,以實作新增我們需要的屬性值,方法尚未整體測驗,僅供參考,
訊息發送程序
-
report_device_property——上傳設備屬性
實際上是把設備狀態結構體的資料,傳遞到屬性上報結構體(property_report_msg_t),然后發送屬性上報結構體內容到屬性上報佇列, -
process_property_report——屬性上報佇列處理
當接收到屬性上報佇列中的資料時,把這些資料傳遞到user_post_property,進行再處理, -
user_post_property :上報內容補全
初步形成json格式,添加其他鍵值對,并呼叫user_property_format對json內容進行再次json格式化,然后呼叫IOT_Linkkit_Report_Ext或IOT_Linkkit_Report實作上報,
訊息接收處理程序
在 smart_outlet_main.c 檔案中定義了系統的各種事件處理函式,在 linkkit_main 函式中注冊了回呼函式,其中包括屬性設定請求回呼,實作陳述句如下,
IOT_RegisterCallback(ITE_PROPERTY_SET, user_property_set_event_handler);
具體程序如下:
-
user_property_set_event_handler——屬性設定請求回呼函式
實際上在內部呼叫了property_setting_handle, -
property_setting_handle——屬性設定處理函式
屬性設定json決議,存放到接收結構體(recv_msg_t)內,如果json內有屬性鍵值對,則呼叫send_msg_to_queue發送接收結構體內容到指令接收佇列, -
send_msg_to_queue——發送訊息到指令接收佇列
發送接收結構體(recv_msg_t)內容到指令接收佇列, -
msg_process_task——指令處理任務
當從指令接收佇列(msg)中讀取到資料時,指令中的屬性值,更新到設備狀態結構體(device_status)相應屬性中,如:
device_status->powerswitch = msg.powerswitch; //更新結構體引數值
也可在此函式中進行相應控制,或由其他任務獲取device_status的最新內容后,完成控制,
在指令處理任務結束時,再進行設備狀態上報,以更新云端狀態,
report_device_property(msg.seq, msg.flag);//上報設備狀態屬性
自定義屬性實作方法
- 修改設備狀態結構體,添加自定義的內容
typedef struct {
uint8_t powerswitch;
uint8_t all_powerstate;
/******user code begin******/
float temp;
float hum;
float temp_set;
/******user code end******/
} device_status_t;
- 修改屬性上報結構體,添加自定義的屬性
typedef struct _PROPERTY_REPORT_MSG {
uint8_t powerswitch;
uint8_t all_powerstate;
char seq[24];
uint32_t flag;
/******user code begin******/
float temp;
float hum;
/******user code end******/
} property_report_msg_t;
- 修改g_property_report陣列,在user_property_format函式中對上報內容json格式化時使用
const char *g_property_report[] = {
#ifdef TSL_FY_SUPPORT
"PowerSwitch",
#endif
"powerstate",
"allPowerstate",
"CommonServiceResponse",
/******user code begin******/
"temperature",
"humidity",
/******user code end******/
};
- 修改report_device_property函式中,屬性上報結構體內容的獲取
msg.powerswitch = device_status->powerswitch;
msg.all_powerstate = device_status->all_powerstate;
/******user code begin******/
msg.temp = device_status->temp;
msg.hum = device_status->hum;
/******user code end******/
- 修改user_post_property上報內容補全函式,將新增的屬性,添加到json字串
cJSON_AddNumberToObject(response_root, "powerstate", msg->powerswitch);
cJSON_AddNumberToObject(response_root, "allPowerstate", msg->all_powerstate);
/******user code begin******/
cJSON_AddNumberToObject(response_root, "temperature", msg->temp);
cJSON_AddNumberToObject(response_root, "humidity", msg->hum);
/******user code end******/
-
至此,屬性上報所需修改內容已經修改完畢,以下為接受處理部分,
-
修改接收結構體recv_msg_t
typedef struct _RECV_MSG{
uint8_t powerswitch;
uint8_t all_powerstate;
int flag;
char seq[24];
uint8_t method;
uint8_t from;
/******user code begin******/
uint8_t temp_set;
/******user code end******/
} recv_msg_t;
- 修改property_setting_handle屬性設定處理函式
把json鍵值對的內容,決議到接收結構體中,并通過ret = 0,表示存在控制指令,觸發send_msg_to_queue,將接收結構體(msg)內容,發送到指令接收佇列,
/******user code begin******/
//設定 temp_set 屬性處理
if ((item = cJSON_GetObjectItem(root, "temp_set")) != NULL && cJSON_IsNumber(item)) {
msg->temp_set = item->valueint;
ret = 0;
}
/******user code end******/
//設定 powerstate 屬性處理
if ((item = cJSON_GetObjectItem(root, "powerstate")) != NULL && cJSON_IsNumber(item)) {
msg->powerswitch = item->valueint;
msg->all_powerstate = msg->powerswitch;
ret = 0;
}
- 修改msg_process_task指令處理任務
獲取訊息接收結構體內容,更新到設備狀態結構體,
/******user code begin******/
device_status->temp_set = msg.temp_set;
/******user code end******/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/253017.html
標籤:其他
