最近学习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******/
来源:oschina
链接:https://my.oschina.net/u/4259850/blog/4929416