完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>
標簽 > TLV
TLV,即Tag(Type)-Length-Value,是一中簡單實用的數據傳輸方案。本章還詳細介紹了TLV協(xié)議,TLV格式,TLV編碼等內容。
傳輸協(xié)議根據TLV(type,length,value)協(xié)議編制
TLV協(xié)議說明:
TLV格式的數據包中類型type指明了當前包的含義,type是單一包的類型或者是嵌套包的類型;
長度length指明了當前包的大小,注意這個的大小包括了type、length、value三部分;
值value包括了該數據包的實際內容,如果是嵌套包,內容為里面各個子包的總和。
當前Type字段為signed short類型,長度為2個字節(jié);
Length字段為signed long 類型,長度為4個字節(jié)。
TLV,即Tag(Type)-Length-Value,是一中簡單實用的數據傳輸方案。
簡單的數據傳輸協(xié)議
在TLV的定義中,可以知道它包括三個域,分別為:標簽域(Tag),長度域(Length),內容域(Value)。這里的長度域的值實際上就是內容域的長度。
其實就是一個簡單的自定義通信協(xié)議,將對應的數據進行編碼、組織。我們之前自己寫一個簡單的C/S模型數據傳輸時,比如發(fā)送一個非基礎類型的結點信息,就會采用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; //標記占用字節(jié)數
unsigned int lengthSize; //數據長度占用字節(jié)數
tlv_entity* sub_tlventity; //子嵌套TLV實體
};
數據的發(fā)送過程其實就是打包的過程,目的是將一個從終端上發(fā)的請求數據——字節(jié)數組,構造成一系列的TLV結構實體;解包的目的剛好相反,就是將TLV結構實體解析成字節(jié)數組,所以對應我們需要一個針對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,包含一個簡單數據元結構或者也可以是一個符合數據元結構。這樣可以看出,算法中必須要實現(xiàn)Tag的嵌套功 能,遞歸算法不可少。
其實說白了,我們看到的XML等標記式的結構也是屬于TLV的,以及facebook的thrift,還有google的protobuf (在這說純屬裝逼,只是簡單了解),基本都是TLV的例子,但是模型簡單,實際的需求決定了處理的難度。哎,就算是簡單的概念吧,我估計大家都沒發(fā)覺自己以前寫代碼用了這樣的概念,只是不知道名字罷了,但是真正的一個嵌套式的TLV結構,在實際應用中絕對還是不簡單的,打包、解析也絕對會是體力活。額,都不知道說什么了,還是去再看看對應的應用層協(xié)議設計再來裝逼吧。
編輯推薦廠商產品技術軟件/工具OS/語言教程專題
電機控制 | DSP | 氮化鎵 | 功率放大器 | ChatGPT | 自動駕駛 | TI | 瑞薩電子 |
BLDC | PLC | 碳化硅 | 二極管 | OpenAI | 元宇宙 | 安森美 | ADI |
無刷電機 | FOC | IGBT | 逆變器 | 文心一言 | 5G | 英飛凌 | 羅姆 |
直流電機 | PID | MOSFET | 傳感器 | 人工智能 | 物聯(lián)網 | NXP | 賽靈思 |
步進電機 | SPWM | 充電樁 | IPM | 機器視覺 | 無人機 | 三菱電機 | ST |
伺服電機 | SVPWM | 光伏發(fā)電 | 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 |