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

13.腾讯云物联网设备端学习---数据模板功能及实现

原创
作者头像
fancyxu
修改2021-10-24 20:30:50
1.1K0
修改2021-10-24 20:30:50
举报
文章被收录于专栏:腾讯云IoT

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

简介

数据模板相关概念和消息格式在之前的文章中已经介绍过了,这里不再赘述,请参见数据模板

数据模板设计如下:

数据模板设计与实现
数据模板设计与实现

设计思路

根据数据模板协议,分为5个文件:

上行消息

主要通过publish进行发送,这里不做赘述。其中属性会涉及到多种上行消息,这里可以通过联合类型来统一接口:

代码语言:javascript
复制
typedef union {
 const char *json;
 int code;
 struct {
 int code;
 UtilsJsonValue client_token;
    } control_reply;
} PropertyPublishParams;

下行消息

其中,每个不同topic(property/event/action)将注册一个context用作管理下行消息的上下文,设计如下:

代码语言:javascript
复制
typedef struct {
 union {
 PropertyMessageCallback property_callback;
 EventMessageCallback event_callback;
 ActionMessageCallback action_callback;
    };
 void *usr_data;
} DataTemplateContext;

主要包括相应的回调以及回调需要使用的用户数据,这里使用了联合类型,从而避免了出现过多的形参类型。

内存优化

重构前的版本,在使用中,由于每次json解析都是动态申请来传递节点,对于资源受限的设备将带来很大的内存消耗和开发上的困难。

相比于重构前的版本,该版本主要对json库进行了改造,将相应的消息传递给上层时,采用指针+长度的方式替代了之前的动态申请的方式,从而降低了内存。原因如下:

  1. 实际应用中,大部分消息在回调中就被消耗完了,所以完全可以利用mqtt包本身的存储空间
  2. 在处理字符串数据的时候,目前CI工具推荐使用安全函数如(strncpy等),所以使用指针+长度更为方便
  3. 对于回调结束后保留的数据最好交给用户处理,而不是sdk内部申请来释放,从而减少内存泄漏风险

具体实现可以参见utils_json_value_get

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

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

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

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

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