自定义数据模板 DataTPL 使用手册
| 文件状态 | 【√】 初 稿 【 】 审核稿 【 】 终 稿 |
|---|---|
| 版本号 | V1.2.83 |
| 保密等级 | 限制公开 |
| 发布人员 | 谭祥 |
| 修订日期 | 2022-08-23 |
变更记录
| 版本 | 日期 | 修改人 | 描述(注明修改的条款或页) |
|---|---|---|---|
| 1.0.12 | 2019-12-16 | 谭祥 | 文档初稿 |
| 1.0.41 | 2020-04-26 | 谭祥 | 增加时间格式定义 |
| 1.1.11 | 2021-01-12 | 谭祥 | 补充GPS格式支持、整型支持factor、offset |
| 1.2.81 | 2022-08-15 | 易建华 | 完善GPS、时间格式示例 |
| 1.2.83 | 2022-08-23 | 易建华 | 增加支持可变字符数据格式 |
介绍
为满足车联网、物联网等数据高速采集频率(如100ms/次)、传输数据项多(如一次采集2000项)的要求,在数据采集中最大限度压缩数据包大小、降低数据包传输流量尤为重要。
脱胎于 RPC (基于TCP协议) 与 HTTP (基于HTTP协议) 的适用场景,借鉴 ProtoBuf 对于 Json数据格式在数据传输中的优点,提出自定义数据模板(DataTPL)方案,针对性解决数据采集高频率、大数据量的痛点。

同时,传统数据采集中一旦涉及数据项增减,云端与终端均需要进行大量的开发适配工作,自定义数据模板(DataTPL)方案在解决此场景时,仅需调整数据模板,云端根据模板匹配对应的数据采集项,免去了云端开发升级的工作量。
此外,云端还需要考虑同时支持不同设备类型的数据采集、兼容不同数据版本的终端数据采集,改动量巨大不利于采集平台的稳定。而自定义数据模板(DataTPL)支持定义多套、多版本的数据模板,灵活适配多类型数据设备的采集。
> 数据模板作用
- 定义数据标准,规范终端数据采集上传、云端数据接收解析。
- 面向数据模板编程,最大限度减少开发量
> 数据模板优势
- 最大限度地压缩数据包的大小、降低数据传输流量
| 对比项 | DataTPL | Json |
|---|---|---|
| 协议 | TCP | HTTP |
| 数据传输 | 报文体积小 | 报文体积大,需要传输 key + value |
| 安全性 | 加密性好 | 明文,安全性低 |
| 耗时 | 传输量小,耗时短 | 耗时较长 |
- 减少开发工作量
>> 示例
经过测试,在采集数据项(772项)时,使用两种方案数据传输包的大小对比
| 对比项 | DataTPL | JSON |
|---|---|---|
| 数据包大小 | 1.62KB | 20.3KB |
DataTPL方案下,由于数据项终端与云端完成约定,传输时只需要传输数据值,体积大幅减小
流程

定义
自定义数据包,最大支持9999字节(9.76K)数据传输
> 模板标识
模板标识即模板标号,是每一套数据模板的唯一标识。根据业务需要支持为不同类型的设备、不同版本的数据,设计为不同的数据模板。
例如:
- 为A类设备定义数据模板 (1001),为B类设备定义数据模板 (1002);
- 后续A类设备需要增加采集
x项数据,则新增数据模板(1003)- …..
>> 规则
- 数字,具备唯一性,模板录入系统时自动生成
- 目前最高支持9999套模板 (4位数)
> 数据项

上图为模板中的数据项样例
>> 已支持数据类型
其中时间、GPS、可变字符为特定格式
| 编号 | 数据类型 | 字节长度 | 使用场景 | 说明 | 物理值示例 |
|---|---|---|---|---|---|
| 1 | 时间 | 固定为8 | 日期、时间格式 | 精度到毫秒 | 2022/10/15 16:02:17.0317 |
| 2 | GPS | 固定为10 | GPS经纬度数据 | 标准经纬度数据 | 23.163207,80.023586 |
| 3 | 有符号整型 | 定义长度 | 带符号的数字,可结合factor、offset | 有符号数字,支持结合比例因子/分辨率(factor)、偏移量(offset)表示负数、小数等数值 | 160 |
| 4 | 无符号整型 | 定义长度 | 无符号的数字,可结合factor、offset | 无符号数字,支持结合比例因子/分辨率(factor)、偏移量(offset)表示负数、小数等数值 | 3282.05 |
| 5 | 字符 | 定义长度 | 可确定长度的字符 | ASCII编码,不支持中文 | 2.2.1.202201090808.rc2.dev |
| 6 | 可变字符 | 最大255 | 无法确定长度的字符型数据、各类复杂格式数据 | 首个BYTE为数据长度,第二个BYTE起为数据,采用ASCII编码,不支持中文 | 多维数组:[[21,32],[15,28],[13,18]……] |
>> 数据格式说明
>>> 时间

【示例】:
2022年7月1日16点47分53秒725毫秒的表示
>>> GPS

【示例】:
109.412734,24.320514 (广西柳州市柳北区解放街道柳州商厦)
>>> 整型
针对可定义长度的数字,支持有符号整型、无符号整型,推荐使用无符号整型
小数
对于小数的数据值,为确保精度不丢失,可结合比例因子/分辨率(factor)转换为整数传输负数
对于负数的数据值,可结合偏移量(offset)转换为正整数传输
关于分辨率(factor)和偏移量(offset)的使用
数据解析
- 转换公式:y=a*x+b
- 公式说明:y 实际物理值, x 传输数据值, a 分辨率(factor), b 偏移量(offset)
- 适用场景:将接收到数据转换为实际物理量
数据发送
- 转换公式:x=(y-b)/a
- 公式说明:y 实际物理值, x 传输数据值, a 分辨率(factor), b 偏移量(offset)
- 适用场景:编写程序时,将已有的物理量转换为传输数据发送出去
参考文档 https://blog.csdn.net/MQ0522/article/details/120502657
【示例】:
数据项如下
| 数据项中文名 | 数据项英文名 | 数据类型 | 字节长度 | 比例因子 | 偏移量 | 小数点位数 | 最大值 | 最小值 | 单位 |
|---|---|---|---|---|---|---|---|---|---|
| 液压温度 | hrtValue | 无符号整型 | 2 | 0.01 | -80 | 2 | -80 | 300 | °C |
一句话总结:传输时使用
0 - 38000来表示-80°C - 300°C当前设备液压温度(HRT)物理值为
-72.46°C,则按照公式:x=(y-b)/ax = (-72.46 - (-80))/0.01 = 754
此时使用
754作为上传数据值
>>> 字符
可定义长度的字符,使用ASCII字符集编码
【示例】:
车辆VIN码:LKGESV520BW123456,转换后
0x4C 0x4B 0x47 0x45 0x53 0x56 0x35 0x32 0x30 0x42 0x57 0x31 0x32 0x33 0x34 0x35 0x36

>>> 可变字符

> 使用建议
无符号整型、有符号整型,推荐优先使用无符号
优先使用正数,针对负数场景建议结合偏移量进行处理
比例因子/分辨率(factor)设计得越小,数值精度越高
对于定义长度的数据类型,数据拼装时应注意数据长度的补白(保证满足数据长度)
字符转换请使用
ASCII字节码非强制场景不使用中文,由于中文需要采用UTF8字符集编码(将造成字符编码的整体变更,同时导致数据包大小整体变大)
开发
> 自定义数据包定义

>> 数据组装说明
- 数据长度千位:自定义数据部分整体长度(包含数据长度的2个字节)
- 自定义数据集模板标识:由平台配置后产生数据模板标识(模板编号, <=9999)
- 自定义数据:终端根据对应数据模板所定义的数据项将所有自定义数据拼接而成
>> 注意事项
数据组装时注意处理网络字节序

> 参考示例
采用数据模板101、长度为1280字节的数据包示例如下:
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
|---|---|---|---|---|---|---|---|---|
| BYTE0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
| BYTE1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| BYTE2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| BYTE3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| ….. |

