TG7100C二次开发——自定义属性设置与上报

不想你离开。 提交于 2021-01-28 12:48:12

TG7100C二次开发——自定义属性设置与上报

最近学习TG7100C的二次开发,遇到了不少问题,最主要的是外设的开发,很多外设功能再aliosthing的上层库函数中还没有实现,比如ADC。
此处先对属性的上报和下发,做一些记录,以实现新增我们需要的属性值,方法尚未整体测试,仅供参考。

消息发送过程

  1. report_device_property——上传设备属性
    实际上是把设备状态结构体的数据,传递到属性上报结构体(property_report_msg_t),然后发送属性上报结构体内容到属性上报队列。

  2. process_property_report——属性上报队列处理
    当接收到属性上报队列中的数据时,把这些数据传递到user_post_property,进行再处理。

  3. 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);

具体过程如下:

  1. user_property_set_event_handler——属性设置请求回调函数
    实际上在内部调用了property_setting_handle。

  2. property_setting_handle——属性设置处理函数
    属性设置json解析,存放到接收结构体(recv_msg_t)内,如果json内有属性键值对,则调用send_msg_to_queue发送接收结构体内容到指令接收队列。

  3. send_msg_to_queue——发送消息到指令接收队列
    发送接收结构体(recv_msg_t)内容到指令接收队列。

  4. msg_process_task——指令处理任务
    当从指令接收队列(msg)中读取到数据时,指令中的属性值,更新到设备状态结构体(device_status)相应属性中,如:
    device_status->powerswitch = msg.powerswitch; //更新结构体参数值
    也可在此函数中进行相应控制,或由其他任务获取device_status的最新内容后,完成控制。
    在指令处理任务结束时,再进行设备状态上报,以更新云端状态。
    report_device_property(msg.seq, msg.flag);//上报设备状态属性




自定义属性实现方法

  1. 修改设备状态结构体,添加自定义的内容
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;
  1. 修改属性上报结构体,添加自定义的属性
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;
  1. 修改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******/
};
  1. 修改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******/
  1. 修改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******/
  1. 至此,属性上报所需修改内容已经修改完毕,以下为接受处理部分。

  2. 修改接收结构体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;
  1. 修改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;
}
  1. 修改msg_process_task指令处理任务
    获取消息接收结构体内容,更新到设备状态结构体。
/******user code begin******/
device_status->temp_set = msg.temp_set;
/******user code end******/
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!