完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>
標簽 > TLV
TLV,即Tag(Type)-Length-Value,是一中簡單實用的數(shù)據(jù)傳輸方案。本章還詳細介紹了TLV協(xié)議,TLV格式,TLV編碼等內(nèi)容。
傳輸協(xié)議根據(jù)TLV(type,length,value)協(xié)議編制
TLV協(xié)議說明:
TLV格式的數(shù)據(jù)包中類型type指明了當前包的含義,type是單一包的類型或者是嵌套包的類型;
長度length指明了當前包的大小,注意這個的大小包括了type、length、value三部分;
值value包括了該數(shù)據(jù)包的實際內(nèi)容,如果是嵌套包,內(nèi)容為里面各個子包的總和。
當前Type字段為signed short類型,長度為2個字節(jié);
Length字段為signed long 類型,長度為4個字節(jié)。
TLV,即Tag(Type)-Length-Value,是一中簡單實用的數(shù)據(jù)傳輸方案。
簡單的數(shù)據(jù)傳輸協(xié)議
在TLV的定義中,可以知道它包括三個域,分別為:標簽域(Tag),長度域(Length),內(nèi)容域(Value)。這里的長度域的值實際上就是內(nèi)容域的長度。
其實就是一個簡單的自定義通信協(xié)議,將對應(yīng)的數(shù)據(jù)進行編碼、組織。我們之前自己寫一個簡單的C/S模型數(shù)據(jù)傳輸時,比如發(fā)送一個非基礎(chǔ)類型的結(jié)點信息,就會采用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];
};
這樣導致的結(jié)果就是對應(yīng)解析的代碼也需要進行修改,加入針對birthday字段的處理,因為原先的處理不知道數(shù)據(jù)包的第三個字段是name還是login_code,這樣的處理只能用作簡單的數(shù)據(jù)包擴展。
但是這個擴展有很大的局限性,總不能這么一直修改吧,所以考慮可以給每個數(shù)據(jù)段加上一個表示Tag(Type),這樣就不用擔心字段的任意添加了,并且對于name域來說,定長的特性肯定是不行的,所以,所以,就有了《Tag, Length, Value》三元組編碼,簡稱TLV編碼。但是需要注意的是,Value具體的含義,還是需要通信需求來決定,所以用裝逼的話來說,TLV這種編碼方式不具備結(jié)構(gòu)化(結(jié)構(gòu)未知)特點。但是TLV具備很好的擴展性,其中字段可以是結(jié)構(gòu)式嵌套即value 域支持復(fù)合型元數(shù)據(jù)結(jié)構(gòu),比如如下定義:
[cpp] view plain copystruct tlv_entity {
unsigned char* tag; //標記
unsigned char* length; //數(shù)據(jù)長度
unsigned char* value; //數(shù)據(jù)
unsigned int tagSize; //標記占用字節(jié)數(shù)
unsigned int lengthSize; //數(shù)據(jù)長度占用字節(jié)數(shù)
tlv_entity* sub_tlventity; //子嵌套TLV實體
};
數(shù)據(jù)的發(fā)送過程其實就是打包的過程,目的是將一個從終端上發(fā)的請求數(shù)據(jù)——字節(jié)數(shù)組,構(gòu)造成一系列的TLV結(jié)構(gòu)實體;解包的目的剛好相反,就是將TLV結(jié)構(gòu)實體解析成字節(jié)數(shù)組,所以對應(yīng)我們需要一個針對TLV數(shù)據(jù)的封裝處理:
[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數(shù)據(jù)元結(jié)構(gòu),盜圖如下:
復(fù)合的TLV數(shù)據(jù)元結(jié)構(gòu):
Primitive or constructed BER-TLV data object number,包含一個簡單數(shù)據(jù)元結(jié)構(gòu)或者也可以是一個符合數(shù)據(jù)元結(jié)構(gòu)。這樣可以看出,算法中必須要實現(xiàn)Tag的嵌套功 能,遞歸算法不可少。
其實說白了,我們看到的XML等標記式的結(jié)構(gòu)也是屬于TLV的,以及facebook的thrift,還有g(shù)oogle的protobuf (在這說純屬裝逼,只是簡單了解),基本都是TLV的例子,但是模型簡單,實際的需求決定了處理的難度。哎,就算是簡單的概念吧,我估計大家都沒發(fā)覺自己以前寫代碼用了這樣的概念,只是不知道名字罷了,但是真正的一個嵌套式的TLV結(jié)構(gòu),在實際應(yīng)用中絕對還是不簡單的,打包、解析也絕對會是體力活。額,都不知道說什么了,還是去再看看對應(yīng)的應(yīng)用層協(xié)議設(shè)計再來裝逼吧。
高性能低功耗模數(shù)轉(zhuǎn)換器TLV2548的詳細資料免費下載立即下載
類別:單片機 2018-05-24 標簽:模數(shù)轉(zhuǎn)換器低功耗TLV
可調(diào)節(jié)和固定低壓差穩(wěn)壓器立即下載
類別:電源技術(shù) 2017-06-25 標簽:穩(wěn)壓器低壓差低壓差穩(wěn)壓器
80C32E單片機與TLV2548的接口電路控制設(shè)計
O 引言 TLV2548是TI公司生產(chǎn)的12位、多通道、小尺寸、低功耗、高速串行A/D轉(zhuǎn)換芯片,它有一個專與DSP連...
編輯推薦廠商產(chǎn)品技術(shù)軟件/工具OS/語言教程專題
電機控制 | DSP | 氮化鎵 | 功率放大器 | ChatGPT | 自動駕駛 | TI | 瑞薩電子 |
BLDC | PLC | 碳化硅 | 二極管 | OpenAI | 元宇宙 | 安森美 | ADI |
無刷電機 | FOC | IGBT | 逆變器 | 文心一言 | 5G | 英飛凌 | 羅姆 |
直流電機 | PID | MOSFET | 傳感器 | 人工智能 | 物聯(lián)網(wǎng) | NXP | 賽靈思 |
步進電機 | SPWM | 充電樁 | IPM | 機器視覺 | 無人機 | 三菱電機 | ST |
伺服電機 | SVPWM | 光伏發(fā)電 | UPS | AR | 智能電網(wǎng) | 國民技術(shù) | Microchip |
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 |