物模型应用开发

最近更新时间:2023-07-12 17:44:12

我的收藏
物模型示例 data_template_sample.c 已实现数据、事件收发及响应的通用处理框架。可以基于此示例开发业务逻辑,上下行业务逻辑添加的入口函数分别为 deal_up_stream_user_logicdeal_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_ENABLED
if(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;
}