当前位置: 首页 > news >正文

【数据交换格式】网络socket编程温度采集智能存储与上报项目技术------JSON、TLV

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习
擅长领域:驱动开发,嵌入式软件开发,BSP开发
作者主页:一个平凡而乐于分享的小比特的个人主页
文章收录专栏:网络socket编程之温度采集智能存储与上报项目,本专栏为网络socket编程之温度采集智能存储与上报项目技术简介,实现流程分析
项目源码:https://gitee.com/TJF865975/project1_ds18b20,README部分包含项目功能及实现,欢迎大家Watch、Star、Fork。
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

1.JSON格式

1.1 JSON格式简介

JSON是一种独立于语言和平台、轻量级的数据交换格式,全称JavaScript对象表示法(JavaScript Object Notation)。起初来源于JavaScript这门语言,后来随着使用的广泛,几乎每门开发语言都有处理JSON的API。

优点:易于人的阅读和编写,易于程序解析与生产。比XML更小、更快、更易解析。
JSON样例:首先一个花括号{},整个代表一个对象,同时里面是一种Key-Value的存储形式,以逗号进行分割。

{"name": "林黛玉","sex": "女","parents": [{"father": "林如海","mother": "贾敏"}],"husband": null,"unmarried": true,"friends": [{"sex": "男","name": "贾宝玉"},{"sex": "女","name": "史湘云"},{"sex": "女","name": "贾探春"}]
}

1.2 JSON数据类型

数据结构:对象(Object)、数组(Array)。
基本类型:string(在双引号中),number(整点或浮点型),Boolean(true,false),null。

1.2.1 对象Object

形式: {key:value, key:value…}
key:string类型;
value:任何基本类型或数据结构;

1.2.2 Array

形式: [value, value…]
value:任何基本类型或数据结构。
实例:

{"name": "林黛玉","sex": "女","talent": ["诗","棋",{"乐器": "古琴"}]
}

2.TLV格式

2.1 TLV格式简介

2.1.1 TLV格式演变

通常需要处理类似字节流的流式数据,那么会面临一个问题就是当数据流源源不断的传输,如何知道数据流中从哪个点开始到那个点结束是一个完整的数据呢?
定长记录
定义每个记录的固定长度。读方读取到了固定的长度之后,即认为获得了完整数据,每读取固定长度之后,就认定为获取了完整数据。
在这里插入图片描述
缺点:固定长度必须取最大数据大小,如果其中多数的数据比较的小,那么会造成空间浪费。

变长记录+分隔符
定义每个记录的固定长度。读方读取到了固定的长度之后,即认为获得了完整数据,每读取固定长度之后,就认定为获取了完整数据。
在这里插入图片描述
定长长度+变长记录
定义一个固定长度的块来作为记录头,该记录头用来存放后面记录的长度。记录头后始终跟着该块描述的长度的记录;每个记录头的长度都是固定的。
读方读取了记录头获取了记录长度,再读取对应长度的数据获得完整数据。
在这里插入图片描述

TLV格式
在这里插入图片描述
TLV是一种可变格式,意思就是:
Type类型, Lenght长度,Value值;
Type和Length的长度固定,一般那是2、4个字节(这里统一采用4个字节);
Value的长度有Length指定;

基于定长长度+边长记录的方式,多加了一个类型字段。这样读方就可以根据不同类型的记录做不同的处理逻辑。
在这里插入图片描述
TLV优缺点:
优点:记录长度动态,节省空间与处理时间;可以针对不同类型的记录做不同的处理,可扩展性、简单易学、 跨语言特性
缺点:因为其增加了2个额外的冗余信息,tag 和len,特别是如果协议大部分是基本数据类型int ,short, byte. 会浪费几倍存储空间。另外Value具体是什么含义,需要通信双方事先得到描述文档,即TLV不具备结构化和自解释特性。

2.1.2 定长不定长

描述Value部分所占字节的个数,编码格式分两类:定长方式(DefiniteForm)和不定长方式(IndefiniteForm),其中定长方式又包括短形式与长形式。

  • 短形式:
    在这里插入图片描述
    字节第7位为0,表示Length使用1个字节即可满足Value类型长度的描述,范围在0~127之间的。
  • 长形式:
    在这里插入图片描述
    即Value类型的长度大于127时,Length需要多个字节来描述,这时第一个字节的第7位置为1,0~6位用来描述Length值占用的字节数,然后直将Length值转为byte后附在其后,如: Value大小占234个字节(11101010),由于大于127,这时Length需要使用两个字节来描述,10000001 11101010

2.2 编码方法

  1. 将类型type用htonl转换为网络字节顺序,指针偏移+4
  2. 将长度length用htonl转换为网络字节顺序,指针偏移+4
  3. 若值value数据类型为int、char、short,则将其转换为网络字节顺序,指针偏移+4;若值为字符串类型,写进后,指针偏移+length

重复上述三步,继续编码后面的 TLV 单元。

2.3 解码方法

  1. 读取type 用ntohl转换为主机字节序得到类型,指针偏移+4
  2. 读取lengh用ntohl转换为主机字节序得到长度;指针偏移+4
  3. 根据得到的长度读取value,若value数据类型为int、char、short,用ntohl转换为主机字节序,指针偏移+4;若value数据类型为字符串类型,指针偏移+length

重复上述三步,继续读取后面的 TLV 单元。

http://www.lryc.cn/news/337938.html

相关文章:

  • IP地址定位技术在各领域的作用
  • 代码随想录 538. 把二叉搜索树转换为累加树
  • JavaWeb--前端--01HTML和CSS
  • Oracle SQL中的DECODE函数与NVL函数:区别与应用场景详析
  • 算法设计与分析实验报告c++实现(N皇后问题、卫兵布置问题、求解填字游戏问题、图的m着色问题)
  • 深入探索Linux中的libgdbus:GDBus库的应用和实现
  • MacOS下Qt 5开发环境安装与配置
  • jquery 实现倒计时
  • MYSQL 5.7重置root密码
  • 博客永久链接与计数
  • 基于 RisingWave 和 ScyllaDB 构建事件驱动应用
  • mysql8.0高可用集群架构实战
  • GRE/MGRE详解
  • 蓝桥杯(填空题)
  • vim快捷指令
  • LINUX 下IPTABLES配置详解
  • CentOS 网卡ifcfg-eth0 ping不通外网(www.baidu.com)
  • 【C++】类和对象②(类的默认成员函数:构造函数 | 析构函数)
  • 【ZZULIOJ】1063: 最大公约与最小公倍(Java)
  • 遍历列举俄罗斯方块的所有形状
  • 将Visio绘图导出PDF文件,使其自适应大小,并去掉导入Latex的边框显示
  • android支付宝接入流程
  • Mac 下 Python+Selenium 自动上传西瓜视频
  • 六:ReentrantLock —— 可重入锁
  • 一种驱动器的功能安全架构介绍
  • 紫光展锐T610平台_4G安卓核心板方案定制开发
  • C++11 设计模式4. 抽象工厂(Abstract Factory)模式
  • 第8周 Python面向对象编程刷题
  • 【学习心得】神经网络知识中的符号解释②
  • Igh related:Small Bug And Notes Record.