物模型示例
data_template_sample.c
已实现数据、事件收发及响应的通用处理框架。可以基于此示例开发业务逻辑,上下行业务逻辑添加的入口函数分别为 deal_up_stream_user_logic
、deal_down_stream_user_logic
。详情可参考 智能灯 的场景示例 light_data_template_sample.c
添加业务处理逻辑。下行业务逻辑实现
服务端下行的数据,SDK 已按物模型协议完成 JSON 数据的解析。ProductDataDefine 是第三步中根据在平台定义的产品物模型生成的模板结构体,由定义的各属性构成成员变量。入参 pData 所指向的属性数据,从服务端下行数据中,SDK 已经按物模型协议完成了属性数据的解析,用户在下行逻辑处理的函数里,可直接使用解析完成的数据添加业务逻辑即可。
用户根据已解析的物模型数据(pData)进行相应的业务逻辑处理。
/*用户需要实现的下行数据的业务逻辑,待用户实现业务逻辑*/static void deal_down_stream_user_logic(void *client, ProductDataDefine * pData){Log_d("someting about your own product logic wait to be done");}
示例代码如下:
/*智能灯属性数据模板*/typedef struct _ProductDataDefine {TYPE_DEF_TEMPLATE_BOOL m_light_switch;TYPE_DEF_TEMPLATE_ENUM m_color;TYPE_DEF_TEMPLATE_INT m_brightness;TYPE_DEF_TEMPLATE_STRING m_name[MAX_STR_NAME_LEN+1];} ProductDataDefine;/*示例灯光控制处理逻辑*/static void deal_down_stream_user_logic(void *client,ProductDataDefine *light){int i;const char * ansi_color = NULL;const char * ansi_color_name = NULL;char brightness_bar[] = "||||||||||||||||||||";int brightness_bar_len = strlen(brightness_bar);/*灯光颜色*/switch(light->m_color) {case eCOLOR_RED:ansi_color = ANSI_COLOR_RED;ansi_color_name = " RED ";break;case eCOLOR_GREEN:ansi_color = ANSI_COLOR_GREEN;ansi_color_name = "GREEN";break;case eCOLOR_BLUE:ansi_color = ANSI_COLOR_BLUE;ansi_color_name = " BLUE";break;default:ansi_color = ANSI_COLOR_YELLOW;ansi_color_name = "UNKNOWN";break;}/* 灯光亮度显示条 */brightness_bar_len = (light->m_brightness >= 100)?brightness_bar_len:(int)((light->m_brightness * brightness_bar_len)/100);for (i = brightness_bar_len; i < strlen(brightness_bar); i++) {brightness_bar[i] = '-';}if(light->m_light_switch){/* 灯光开启时,按照控制参数展示 */HAL_Printf( "%s[ lighting ]|[color:%s]|[brightness:%s]|[%s]\\n" ANSI_COLOR_RESET,\\ansi_color,ansi_color_name,brightness_bar,light->m_name);}else{/* 灯光关闭展示 */HAL_Printf( ANSI_COLOR_YELLOW"[ light is off ]|[color:%s]|[brightness:%s]|[%s]\\n" ANSI_COLOR_RESET,\\ansi_color_name,brightness_bar,light->m_name);}#ifdef EVENT_POST_ENABLEDif(eCHANGED == sg_DataTemplate[0].state){if(light->m_light_switch){memset(sg_message, 0, MAX_EVENT_STR_MESSAGE_LEN);strcpy(sg_message,"light on");sg_status = 1;}else{memset(sg_message, 0, MAX_EVENT_STR_MESSAGE_LEN);strcpy(sg_message,"light off");sg_status = 0;}IOT_Event_setFlag(client, FLAG_EVENT0);/*灯的开关状态发生变化时置位事件,在eventPostCheck中会将置位的事件上报*/}#endif}
上行业务逻辑实现
设备端根据业务场景需要,对设备端数据属性采取一定策略进行监测处理。
用户可以在
deal_up_stream_user_logic
中,将需要上报的属性更新给入参 pReportDataList 属性,上报列表及需要上报的属性个数,物模型的示例处理框架,在 IOT_Template_JSON_ConstructReportArray
中属性数据列表将会处理为物模型的协议格式,IOT_Template_Report
将数据发送给服务端。示例代码如下:
/*用户根据业务修改属性值,然后设置属性状态为eCHANGED*/static void _refresh_local_property(void){//add your local property refresh logic}/*用户需要实现的上行数据的业务逻辑,此处仅供示例*/static int deal_up_stream_user_logic(DeviceProperty *pReportDataList[], int *pCount){int i, j;/*监测是否需要更新本地数据*/_refresh_local_property();/*将变化的属性更新到上报列表*/for (i = 0, j = 0; i < TOTAL_PROPERTY_COUNT; i++) {if(eCHANGED == sg_DataTemplate[i].state) {pReportDataList[j++] = &(sg_DataTemplate[i].data_property);sg_DataTemplate[i].state = eNOCHANGE;}}*pCount = j;return (*pCount > 0)?QCLOUD_RET_SUCCESS:QCLOUD_ERR_FAILURE;}