物聯(lián)網(wǎng)協(xié)議TLV協(xié)議設(shè)計(jì)及實(shí)現(xiàn)
? ? 物聯(lián)網(wǎng)接入做了好幾年了,由于之前的協(xié)議是固定字段和內(nèi)容的,很多時(shí)候不方便調(diào)控及升級(jí)處理?,F(xiàn)場(chǎng)設(shè)備調(diào)控參數(shù)較多且物聯(lián)網(wǎng)開(kāi)發(fā)部分不怎么方便使用Protobuf類的編解碼方案,因此此處設(shè)計(jì)并實(shí)現(xiàn)一個(gè)基于TLV結(jié)構(gòu)的協(xié)議及其編解碼實(shí)現(xiàn)過(guò)程。
一、協(xié)議適用范圍:
1、藍(lán)牙通信
2、Wifi通信
3、LoRa通信
4、ZigBee通信
5、基于MQTT的通信或其他上層協(xié)議通信
二、協(xié)議適用設(shè)備:
超低功耗物聯(lián)網(wǎng)設(shè)備或上位機(jī)間通信也可以。
三、Node或網(wǎng)頁(yè)前端使用方案
四、協(xié)議內(nèi)容
1、數(shù)據(jù)交互過(guò)程 0讀取 1寫(xiě)入 2確認(rèn) 3上報(bào)
1、設(shè)備上報(bào) Op=3 響應(yīng)Op=2
2、設(shè)備請(qǐng)求讀取參數(shù) Op=0 響應(yīng)Op=1
3、服務(wù)端下發(fā)參數(shù) Op=1 響應(yīng)Op=2
4、服務(wù)端讀取設(shè)備參數(shù) Op=0 設(shè)備響應(yīng)Op=1
2、?確認(rèn)數(shù)據(jù)區(qū)結(jié)構(gòu)
①成功
00
②部分成功
? 01? ? ? ? ? ???01? ?? ?01? ? ? ? ? ?? ?02 ? ?01
部分成功 ? TagID 錯(cuò)誤原因 TagID 錯(cuò)誤原因
③全部失敗
02
④解析失敗
03
3、數(shù)據(jù)類型定義

4、協(xié)議數(shù)據(jù)幀結(jié)構(gòu)
0x68 ? ?00? ? ? ? ? 0000? ? ? ??0123? ? ? ? 0011223344 ? 00
固定 ?操作/狀態(tài) ?幀序號(hào) ?數(shù)據(jù)長(zhǎng)度 ? 實(shí)際數(shù)據(jù)內(nèi)容 ?累加校驗(yàn)和
添加校驗(yàn)和的目的是為了方便嵌入式設(shè)備中在線路傳輸過(guò)程中產(chǎn)生干擾。
5、操作狀態(tài)項(xiàng) 按二進(jìn)制分布
從高到低分別表示
第n位可選值含義70,1是否攜帶8字節(jié)產(chǎn)品信息60,1TagID的長(zhǎng)度是1字節(jié)或2字節(jié)4-50,1,2,30未壓縮 1BZ壓縮 2LZ壓縮 3GZ0-30-15操作號(hào) 0讀取 1寫(xiě)入 2確認(rèn) 3上報(bào)
6、TLV設(shè)計(jì)
① TagID 由于TagID長(zhǎng)度不定,此處使用大端模式,及當(dāng)TagID>=255時(shí)使用2字節(jié),否則使用1字節(jié)。
示例:(大端模式,高位在前)
var TagID=1; //此時(shí)TagID<255,使用1字節(jié)表示TagID值
var TagID=50; //此時(shí)TagID<255,使用1字節(jié)表示TagID值
var TagID=255; //此時(shí)TagID>=255,使用2字節(jié)表示TagID值
var TagID=1000; //此時(shí)TagID>=255,使用2字節(jié)表示TagID值
② TagLength 在確定數(shù)據(jù)長(zhǎng)度的情況下不需要該編解碼該數(shù)據(jù)項(xiàng),否則按如下形式編解碼
示例:(大端模式,高位在前)
// 長(zhǎng)度位第一字節(jié)的最高位若為1表示2字節(jié),否則1字節(jié)
var Length=1; //此時(shí)Length<127,使用1字節(jié)表示Length值
var Length=50; //此時(shí)Length<127,使用1字節(jié)表示Length值
var Length=255; //此時(shí)Length>127,使用2字節(jié)表示Length值
var Length=1000; //此時(shí)Length>127,使用2字節(jié)表示Length值
// 編碼代碼
let zlen = uint_encode(b.length, b.length > 127 ? 2 : 1, false)
if (b.length > 127) { ? ?zlen[0] |= 0x80}
// 解碼代碼
let tlen = b[0] & 0x80 ? 2 : 1;b[0] &= 0x7frs.Len = uint_decode(b, tlen, 0, false)
③ TagValue 根據(jù)對(duì)應(yīng)的數(shù)據(jù)類型進(jìn)行編解碼操作
五、JSON數(shù)據(jù)及編碼結(jié)構(gòu)示例
Int/Uint/Float/Double 編解碼
{"k0":-17,"k2t0":-676,"k4t0":36208,"k1":205,"k2t1":26407,"k4t1":456996,"Float":0.25,"Double":0.2515156}68011a04220000ef015cfd02708d000003cd0427670524f90600060000803e07abc31be3d418d03fad{"k0":25,"k2t0":799,"k4t0":3740,"k1":230,"k2t1":29411,"k4t1":430104,"Float":0.25,"Double":0.2515156}68011a0422000019011f03029c0e000003e604e3720518900600060000803e07abc31be3d418d03fb8{"k0":-15,"k2t0":576,"k4t0":9321,"k1":18,"k2t1":57518,"k4t1":344205,"Float":0.25,"Double":0.2515156}68011a04220000f10140020269240000031204aee0058d400500060000803e07abc31be3d418d03f1c{"k0":22,"k2t0":-483,"k4t0":-9686,"k1":101,"k2t1":48270,"k4t1":276338,"Float":0.25,"Double":0.2515156}68011a0422000016011dfe022adaffff0365048ebc0572370400060000803e07abc31be3d418d03f79{"k0":-42,"k2t0":245,"k4t0":29086,"k1":133,"k2t1":43426,"k4t1":243070,"Float":0.25,"Double":0.2515156}68011a04220000d601f500029e710000038504a2a9057eb50300060000803e07abc31be3d418d03fca{"k0":-32,"k2t0":-589,"k4t0":-54140,"k1":67,"k2t1":1877,"k4t1":368689,"Float":0.25,"Double":0.2515156}68011a04220000e001b3fd02842cffff03430455070531a00500060000803e07abc31be3d418d03f9d{"k0":1,"k2t0":657,"k4t0":-59838,"k1":237,"k2t1":42582,"k4t1":216526,"Float":0.25,"Double":0.2515156}68011a0422000001019102024216ffff03ed0456a605ce4d0300060000803e07abc31be3d418d03fdb{"k0":34,"k2t0":-781,"k4t0":1334,"k1":219,"k2t1":48774,"k4t1":126956,"Float":0.25,"Double":0.2515156}68011a042200002201f3fc023605000003db0486be05ecef0100060000803e07abc31be3d418d03f31{"k0":-30,"k2t0":491,"k4t0":-23382,"k1":162,"k2t1":18530,"k4t1":537141,"Float":0.25,"Double":0.2515156}68011a04220000e201eb0102aaa4ffff03a20462480535320800060000803e07abc31be3d418d03fbf{"k0":46,"k2t0":521,"k4t0":-61176,"k1":239,"k2t1":63115,"k4t1":525557,"Float":0.25,"Double":0.2515156}68011a042200002e010902020811ffff03ef048bf605f5040800060000803e07abc31be3d418d03fab
定長(zhǎng) String/Hex/base64 編解碼
{"k7":"a","k5t7":"12345","k10t7":"12345","k8":"aa","k5t8":"0011223344","k10t8":"00112233440011223344","k9":"YQ==","k5t9":"YWJjZGU="}68011a042e000061013132333435023132333435000000000003aa0400112233440500112233440011223344066107616263646528{"k7":"a","k5t7":"12345","k10t7":"12345","k8":"aa","k5t8":"0011223344","k10t8":"00112233440011223344","k9":"YQ==","k5t9":"YWJjZGU="}68011a042e000061013132333435023132333435000000000003aa0400112233440500112233440011223344066107616263646528{"k7":"a","k5t7":"12345","k10t7":"12345","k8":"aa","k5t8":"0011223344","k10t8":"00112233440011223344","k9":"YQ==","k5t9":"YWJjZGU="}68011a042e000061013132333435023132333435000000000003aa0400112233440500112233440011223344066107616263646528{"k7":"a","k5t7":"12345","k10t7":"12345","k8":"aa","k5t8":"0011223344","k10t8":"00112233440011223344","k9":"YQ==","k5t9":"YWJjZGU="}68011a042e000061013132333435023132333435000000000003aa0400112233440500112233440011223344066107616263646528{"k7":"a","k5t7":"12345","k10t7":"12345","k8":"aa","k5t8":"0011223344","k10t8":"00112233440011223344","k9":"YQ==","k5t9":"YWJjZGU="}68011a042e000061013132333435023132333435000000000003aa0400112233440500112233440011223344066107616263646528{"k7":"a","k5t7":"12345","k10t7":"12345","k8":"aa","k5t8":"0011223344","k10t8":"00112233440011223344","k9":"YQ==","k5t9":"YWJjZGU="}68011a042e000061013132333435023132333435000000000003aa0400112233440500112233440011223344066107616263646528{"k7":"a","k5t7":"12345","k10t7":"12345","k8":"aa","k5t8":"0011223344","k10t8":"00112233440011223344","k9":"YQ==","k5t9":"YWJjZGU="}68011a042e000061013132333435023132333435000000000003aa0400112233440500112233440011223344066107616263646528{"k7":"a","k5t7":"12345","k10t7":"12345","k8":"aa","k5t8":"0011223344","k10t8":"00112233440011223344","k9":"YQ==","k5t9":"YWJjZGU="}68011a042e000061013132333435023132333435000000000003aa0400112233440500112233440011223344066107616263646528{"k7":"a","k5t7":"12345","k10t7":"12345","k8":"aa","k5t8":"0011223344","k10t8":"00112233440011223344","k9":"YQ==","k5t9":"YWJjZGU="}68011a042e000061013132333435023132333435000000000003aa0400112233440500112233440011223344066107616263646528{"k7":"a","k5t7":"12345","k10t7":"12345","k8":"aa","k5t8":"0011223344","k10t8":"00112233440011223344","k9":"YQ==","k5t9":"YWJjZGU="}68011a042e000061013132333435023132333435000000000003aa0400112233440500112233440011223344066107616263646528
不定長(zhǎng)String/hex/base64 編解碼
{"Hex12":"00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff"}68011a04530100015000112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff04
六、編碼代碼
七、解碼代碼
八、類型定義
源碼地址:https://gitee.com/tansuyun/tlv