物联网协议TLV协议设计及实现
物联网接入做了好几年了,由于之前的协议是固定字段和内容的,很多时候不方便调控及升级处理。现场设备调控参数较多且物联网开发部分不怎么方便使用Protobuf类的编解码方案,因此此处设计并实现一个基于TLV结构的协议及其编解码实现过程。
一、协议适用范围:
1、蓝牙通信
2、Wifi通信
3、LoRa通信
4、ZigBee通信
5、基于MQTT的通信或其他上层协议通信
二、协议适用设备:
超低功耗物联网设备或上位机间通信也可以。
三、Node或网页前端使用方案
四、协议内容
1、数据交互过程 0读取 1写入 2确认 3上报
1、设备上报 Op=3 响应Op=2
2、设备请求读取参数 Op=0 响应Op=1
3、服务端下发参数 Op=1 响应Op=2
4、服务端读取设备参数 Op=0 设备响应Op=1
2、 确认数据区结构
①成功
00
②部分成功
01 01 01 02 01
部分成功 TagID 错误原因 TagID 错误原因
③全部失败
02
④解析失败
03
3、数据类型定义

4、协议数据帧结构
0x68 00 0000 0123 0011223344 00
固定 操作/状态 帧序号 数据长度 实际数据内容 累加校验和
添加校验和的目的是为了方便嵌入式设备中在线路传输过程中产生干扰。
5、操作状态项 按二进制分布
从高到低分别表示
第n位可选值含义70,1是否携带8字节产品信息60,1TagID的长度是1字节或2字节4-50,1,2,30未压缩 1BZ压缩 2LZ压缩 3GZ0-30-15操作号 0读取 1写入 2确认 3上报
6、TLV设计
① TagID 由于TagID长度不定,此处使用大端模式,及当TagID>=255时使用2字节,否则使用1字节。
示例:(大端模式,高位在前)
var TagID=1; //此时TagID<255,使用1字节表示TagID值
var TagID=50; //此时TagID<255,使用1字节表示TagID值
var TagID=255; //此时TagID>=255,使用2字节表示TagID值
var TagID=1000; //此时TagID>=255,使用2字节表示TagID值
② TagLength 在确定数据长度的情况下不需要该编解码该数据项,否则按如下形式编解码
示例:(大端模式,高位在前)
// 长度位第一字节的最高位若为1表示2字节,否则1字节
var Length=1; //此时Length<127,使用1字节表示Length值
var Length=50; //此时Length<127,使用1字节表示Length值
var Length=255; //此时Length>127,使用2字节表示Length值
var Length=1000; //此时Length>127,使用2字节表示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 根据对应的数据类型进行编解码操作
五、JSON数据及编码结构示例
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
定长 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
不定长String/hex/base64 编解码
{"Hex12":"00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff"}68011a04530100015000112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff04
六、编码代码
七、解码代码
八、类型定义
源码地址:https://gitee.com/tansuyun/tlv