前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >14.腾讯云物联网设备端学习---数据模板应用开发

14.腾讯云物联网设备端学习---数据模板应用开发

原创
作者头像
fancyxu
修改2021-10-25 09:54:55
4.4K1
修改2021-10-25 09:54:55
举报
文章被收录于专栏:腾讯云IoT

本系列主要目的在于记录腾讯云物联网设备端的学习笔记,并且对设备端SDK进行补充说明。

简介

数据模板相关概念,请参见数据模板

数据模板功能实现,请参见数据模板功能及实现

以下介绍如何基于数据模板进行应用开发,主要包括数据模板代码化下行数据处理上行数据上报

源码请参见:

https://github.com/xyfancy/iot-hub-device-c-sdk/tree/master/app/data_template

数据模板代码化

核心思想:将数据模板定义转换成相应的C代码数据类型,比如整数型->int,提供通用的接口根据索引访问(该实现处于beta版本,后续采用脚本自动化生成)。

源码:data_template_config.cdata_template_config.h

以灯开关属性为例:

1.初始化

属性包括:

  • type:对应数据模板类型
  • key:对应该属性的关键字
  • value:值的存储空间
  • need_report:是否需要上报,当值发生改变时,需要上报平台用作同步(特别地:如果只是下行属性,且不用平台保存状态,可以不用上报)
代码语言:javascript
复制
struct DataTemplateProperty {
    DataTemplatePropertyType  type;
    const char*               key;
    DataTemplatePropertyValue value;
    int                       need_report;
};

根据控制台上数据模板的定义,初始化开关属性:

  • 类型:布尔型
  • 关键字:power_switch
  • 值:可用C语言中的int存储,其中值使用了联合类型,用户需要根据数据模板类型来选择成员。
  • 是否上报:因为开关离线状态下可有人为修改,所以初始化时需要上报)
代码语言:javascript
复制
sg_usr_data_template_property[USR_PROPERTY_INDEX_POWER_SWITCH].value.value_bool = 0;
sg_usr_data_template_property[USR_PROPERTY_INDEX_POWER_SWITCH].key              = "power_switch";
sg_usr_data_template_property[USR_PROPERTY_INDEX_POWER_SWITCH].type             = DATA_TEMPLATE_TYPE_BOOL;
sg_usr_data_template_property[USR_PROPERTY_INDEX_POWER_SWITCH].need_report      = 1;

2.接口调用

通过将数据模板建立索引,通过索引进行访问相应的数据模板

代码语言:javascript
复制
typedef enum {
    USR_PROPERTY_INDEX_POWER_SWITCH = 0, // 开关索引
    USR_PROPERTY_INDEX_COLOR,
    USR_PROPERTY_INDEX_BRIGHTNESS,
    USR_PROPERTY_INDEX_NAME,
    USR_PROPERTY_INDEX_POSITION,
    USR_PROPERTY_INDEX_POWER,
} UsrPropertyIndex;
代码语言:javascript
复制
//初始化
void usr_data_template_init(void);
//获取非结构体类型的数据模板值
DataTemplatePropertyValue usr_data_template_property_value_get(UsrPropertyIndex index);
//设置非结构体类型的数据模板值
void usr_data_template_property_value_set(UsrPropertyIndex index, DataTemplatePropertyValue value);
//获取结构体类型的数据模板值
DataTemplatePropertyValue usr_data_template_property_struct_value_get(UsrPropertyIndex struct_index,
                                                                      int              property_index);
//设置结构体类型的数据模板值
void usr_data_template_property_struct_value_set(UsrPropertyIndex struct_index, int property_index,
                                                 DataTemplatePropertyValue value);
//获取行为中输入参数的数据模板值                                                 
DataTemplatePropertyValue usr_data_template_action_input_value_get(UsrActionIndex index, int property_index);
代码语言:javascript
复制
// 通过解析control或者get_status中control消息中的params设置相应的属性
void usr_data_template_property_parse(UtilsJsonValue params);
// 上报所有需要上报的属性,need_report为1
int usr_data_template_property_report(void* client, char* buf, int buf_len);
// 上报事件,此处用户自行构造json,灵活度更高
void usr_data_template_event_post(void* client, char* buf, int buf_len, UsrEventIndex id, const char* params);
// 通过解析action消息中的输入参数设置相应的属性
int usr_data_template_action_parse(UtilsJsonValue action_id, UtilsJsonValue params, UsrActionIndex* index);
// 行为的回复
int usr_data_template_action_reply(void* client, char* buf, int buf_len, UsrActionIndex index,
                                   UtilsJsonValue client_token, int code, const char* response);

下行数据处理

源码:data_template_app.c

下行数据主要包括:

  1. control消息:回调中设置属性值,然后读取属性值进行处理
    1. method_control_callback->usr_data_template_property_parse->usr_data_template_property_value_get
  2. action消息:回调中设置输入参数属性值,然后读取属性值进行处理
    1. method_action_callback->usr_data_template_action_parse->usr_data_template_action_input_value_get
  3. get_status消息:回调中设置control消息的属性值,然后读取属性值进行处理
    1. method_get_status_reply_callback->usr_data_template_property_parse->usr_data_template_property_value_get
  4. 各类消息的回复:
    1. 如果需要实现QOS1质量,请在应用层建立队列实现(这里取决于业务,不同业务要求对于重发的要求以及超时的时间均不一致,后续根据业务经验总结出典型的示例)。
    2. 如果是QOS0质量,可直接忽略所有的回复(大部分数据采集类的消息均可如此处理)。

上行数据上报

源码:data_template_app.c

上线行数据主要包括:

  1. report消息:设置属性值(need_reoprt置为1),然后调用接口上报所有need_report为1 的属性
    1. usr_data_template_property_value_set->usr_data_template_property_report
  2. control_reply消息:回调中调用接口直接回复,实际不回复也行,取决于业务
    1. method_control_callback->IOT_DataTemplate_PropertyControlReply
  3. action_reply消息:调用中根据结果进行回复,因为云API有超时限制,所以回复必须立即,如果完成不了行为,请采用属性上报的方式回复。
    1. method_action_callback->usr_data_template_action_reply
  4. event上报:调用接口,自行改造json上报,sdk中提供了示例。这样更灵活且简单
    1. usr_data_template_event_post

注意事项

本文提供的方法针对以往的业务进行总结设计,有以下限制,请根据业务进行修改:

  1. 默认所有的属性通过usr_data_template_property_value_set设置后均会置need_report为1,并在调用usr_data_template_property_report后上报。如果不需要上报的属性,可自行根据属性索引进行过滤。
  2. usr_data_template_property_parse会解析json中所有的属性并设置,如果需要多个属性共同生效的业务,请将这些属性整合到结构体或者字符串类型中,或者修改该接口的实现,针对索引进行判断。
  3. 所有回复均不处理,针对某些特殊的场景(弱网),应用层实现QOS1,目前接触的项目需求较少。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 数据模板代码化
  • 下行数据处理
  • 上行数据上报
  • 注意事项
相关产品与服务
物联网通信
腾讯云物联网通信(Internet of Things Hub, IoT Hub)旨在提供一个安全、稳定、高效的连接平台,帮助开发者低成本、快速地实现“设备-设备”、“设备-用户应用”、“设备-云服务”之间可靠、高并发的数据通信。物联网通信平台不仅可以实现设备之间的互动、设备的数据上报和配置下发,还可以基于规则引擎和腾讯云产品打通,方便快捷地实现海量设备数据的存储、计算以及智能分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档