完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>
标签 > TLV
TLV,即Tag(Type)-Length-Value,是一中简单实用的数据传输方案。本章还详细介绍了TLV协议,TLV格式,TLV编码等内容。
传输协议根据TLV(type,length,value)协议编制
TLV协议说明:
TLV格式的数据包中类型type指明了当前包的含义,type是单一包的类型或者是嵌套包的类型;
长度length指明了当前包的大小,注意这个的大小包括了type、length、value三部分;
值value包括了该数据包的实际内容,如果是嵌套包,内容为里面各个子包的总和。
当前Type字段为signed short类型,长度为2个字节;
Length字段为signed long 类型,长度为4个字节。
TLV,即Tag(Type)-Length-Value,是一中简单实用的数据传输方案。
简单的数据传输协议
在TLV的定义中,可以知道它包括三个域,分别为:标签域(Tag),长度域(Length),内容域(Value)。这里的长度域的值实际上就是内容域的长度。
其实就是一个简单的自定义通信协议,将对应的数据进行编码、组织。我们之前自己写一个简单的C/S模型数据传输时,比如发送一个非基础类型的结点信息,就会采用struct,比如:
[cpp] view plain copystruct Messagebase{
unsigned int command;
char login_code[8];
char name[8];
};
这个struct描述了简单的login操作的需求信息,但是比如说有一天我们需要增加一个字段,加上login人的年龄,就需要新的一个字段:
[cpp] view plain copystruct Messagebase{
unsigned int command;
unsigned int birthday;
char login_code[8];
char name[8];
};
这样导致的结果就是对应解析的代码也需要进行修改,加入针对birthday字段的处理,因为原先的处理不知道数据包的第三个字段是name还是login_code,这样的处理只能用作简单的数据包扩展。
但是这个扩展有很大的局限性,总不能这么一直修改吧,所以考虑可以给每个数据段加上一个表示Tag(Type),这样就不用担心字段的任意添加了,并且对于name域来说,定长的特性肯定是不行的,所以,所以,就有了《Tag, Length, Value》三元组编码,简称TLV编码。但是需要注意的是,Value具体的含义,还是需要通信需求来决定,所以用装逼的话来说,TLV这种编码方式不具备结构化(结构未知)特点。但是TLV具备很好的扩展性,其中字段可以是结构式嵌套即value 域支持复合型元数据结构,比如如下定义:
[cpp] view plain copystruct tlv_entity {
unsigned char* tag; //标记
unsigned char* length; //数据长度
unsigned char* value; //数据
unsigned int tagSize; //标记占用字节数
unsigned int lengthSize; //数据长度占用字节数
tlv_entity* sub_tlventity; //子嵌套TLV实体
};
数据的发送过程其实就是打包的过程,目的是将一个从终端上发的请求数据——字节数组,构造成一系列的TLV结构实体;解包的目的刚好相反,就是将TLV结构实体解析成字节数组,所以对应我们需要一个针对TLV数据的封装处理:
[cpp] view plain copyclass tlv_deal{
Public:
tlv_deal();
virtual ~tlv_deal();
static void construct_MS(unsigned char* buffer,unsigned int buffer_len,
tlv_entity* entity,unsigned int entity_len,unsigned int status=0 );
static void parse_MS(unsigned char* buffer,unsigned int buffer_len,
tlv_entity* entity,unsigned int entity_len);
};
对于简单的TLV数据元结构,盗图如下:
复合的TLV数据元结构:
Primitive or constructed BER-TLV data object number,包含一个简单数据元结构或者也可以是一个符合数据元结构。这样可以看出,算法中必须要实现Tag的嵌套功 能,递归算法不可少。
其实说白了,我们看到的XML等标记式的结构也是属于TLV的,以及facebook的thrift,还有google的protobuf (在这说纯属装逼,只是简单了解),基本都是TLV的例子,但是模型简单,实际的需求决定了处理的难度。哎,就算是简单的概念吧,我估计大家都没发觉自己以前写代码用了这样的概念,只是不知道名字罢了,但是真正的一个嵌套式的TLV结构,在实际应用中绝对还是不简单的,打包、解析也绝对会是体力活。额,都不知道说什么了,还是去再看看对应的应用层协议设计再来装逼吧。
编辑推荐厂商产品技术软件/工具OS/语言教程专题
电机控制 | DSP | 氮化镓 | 功率放大器 | ChatGPT | 自动驾驶 | TI | 瑞萨电子 |
BLDC | PLC | 碳化硅 | 二极管 | OpenAI | 元宇宙 | 安森美 | ADI |
无刷电机 | FOC | IGBT | 逆变器 | 文心一言 | 5G | 英飞凌 | 罗姆 |
直流电机 | PID | MOSFET | 传感器 | 人工智能 | 物联网 | NXP | 赛灵思 |
步进电机 | SPWM | 充电桩 | IPM | 机器视觉 | 无人机 | 三菱电机 | ST |
伺服电机 | SVPWM | 光伏发电 | UPS | AR | 智能电网 | 国民技术 | Microchip |
开关电源 | 步进电机 | 无线充电 | LabVIEW | EMC | PLC | OLED | 单片机 |
5G | m2m | DSP | MCU | ASIC | CPU | ROM | DRAM |
NB-IoT | LoRa | Zigbee | NFC | 蓝牙 | RFID | Wi-Fi | SIGFOX |
Type-C | USB | 以太网 | 仿真器 | RISC | RAM | 寄存器 | GPU |
语音识别 | 万用表 | CPLD | 耦合 | 电路仿真 | 电容滤波 | 保护电路 | 看门狗 |
CAN | CSI | DSI | DVI | Ethernet | HDMI | I2C | RS-485 |
SDI | nas | DMA | HomeKit | 阈值电压 | UART | 机器学习 | TensorFlow |
Arduino | BeagleBone | 树莓派 | STM32 | MSP430 | EFM32 | ARM mbed | EDA |
示波器 | LPC | imx8 | PSoC | Altium Designer | Allegro | Mentor | Pads |
OrCAD | Cadence | AutoCAD | 华秋DFM | Keil | MATLAB | MPLAB | Quartus |
C++ | Java | Python | JavaScript | node.js | RISC-V | verilog | Tensorflow |
Android | iOS | linux | RTOS | FreeRTOS | LiteOS | RT-THread | uCOS |
DuerOS | Brillo | Windows11 | HarmonyOS |