在嵌入式软件开发中经常看到有朋友自定义协议主要还是资源受限然后功能也相对比较专业后续维护其实也简单很多但到了项目的一定阶段或者规模又不得不考虑可扩展性、兼容性等等问题那么协议上就感觉千奇百怪了那么今天bug菌跟大家聊聊通信协议中的TLV格式基本上自定义协议最终都会向该方式或者类似的方式去靠拢所以一步到位多好~1TLV数据格式嵌入式物联网中的TLVType-Length-Value格式是一种高效、灵活的数据封装方式广泛应用于资源受限的物联网设备通信中。结构解析:Type类型标识数据的类型如电压、温度、湿度等通常用1-2字节表示。例如0x01代表电压0x02代表温度。类型基本上就决定了这个TLV数据单元的长度所占字节和Value的解析方式等。Length长度表示Value字段的字节数可固定或变长编码。例如1字节0-255或变长整数节省空间。Value值实际数据内容长度由Length字段定义如温度值3.11V放大1000倍编码为整形两个字节0x0C 0x1C。介绍了TLV数据封装格式那么下面再详细介绍下其三大特点:2类型自描述每个TLV结构的第一部分为Type字段通常为1-4字节用于明确标识数据的语义和编码方式前面在介绍该字段的时候有说明了一下。但是该字段需要收发双方约定好这样就诞生了类型映射表。类型映射表Type值通过预定义的协议规范或动态协商如设备握手阶段确定接收方根据Type值选择对应的解析逻辑。 若Type值与实际数据格式不匹配例如Type声明为整数但Value为字符串接收方可直接报错。 这样的话就无需外部元数据数据本身携带类型信息解析器无需依赖额外的协议文档或配置文件现在挺多高级一点的序列化工具都需要使用工具等麻烦。在兼容性方面不同设备或协议版本可以通过扩展Type定义如预留私有Type范围实现兼容旧设备可忽略未知Type。同样你进行协议升级的时候只需定义新Type值如0x04表示PM2.5旧设备可跳过未知字段新设备解析新数据当前前提是你需要定义较多的type字段。3动态变长紧随Type后的Length字段长度并不是固定的通常为1-4字节够了它主要是用于声明Value部分的字节长度。例如若Value是4字节整数Length0x04若Value是可变长字符串HelloLength0x05当然也可以更加灵活的编码Length字段的字节数可根据协议设计动态调整。短数据≤255字节Length用1字节表示长数据如固件包Length用4字节表示这样一方面能够节省避免固定长度字段的填充浪费另一方面可以支持可变数据以适应物联网场景中数据长度多变的需求如传感器数据、配置参数、日志文本。不知道大家平时用过流式传输没通过Length提前预知数据边界无需等待完整数据包做到接收方可边接收边解析数据。4高效二进制编码TLV整体以二进制字节流传输而非文本格式如JSON、XML。而且在协议约定中采用的是一种紧凑编码规则比如:整数使用最小字节数如0x7F以内用1字节超过则用2字节浮点数采用IEEE 754标准压缩枚举值直接用单字节表示等等可以做到无需转换直接按字节偏移读取数据在资源受限平台大家确实比较钟爱。按照TLV的数据封装自定义协议基本上能够满足大部分嵌入式应用场景了。
嵌入式自定义协议按TLV格式封装后真方便~嵌入式情报局
发布时间:2026/7/4 23:03:01
在嵌入式软件开发中经常看到有朋友自定义协议主要还是资源受限然后功能也相对比较专业后续维护其实也简单很多但到了项目的一定阶段或者规模又不得不考虑可扩展性、兼容性等等问题那么协议上就感觉千奇百怪了那么今天bug菌跟大家聊聊通信协议中的TLV格式基本上自定义协议最终都会向该方式或者类似的方式去靠拢所以一步到位多好~1TLV数据格式嵌入式物联网中的TLVType-Length-Value格式是一种高效、灵活的数据封装方式广泛应用于资源受限的物联网设备通信中。结构解析:Type类型标识数据的类型如电压、温度、湿度等通常用1-2字节表示。例如0x01代表电压0x02代表温度。类型基本上就决定了这个TLV数据单元的长度所占字节和Value的解析方式等。Length长度表示Value字段的字节数可固定或变长编码。例如1字节0-255或变长整数节省空间。Value值实际数据内容长度由Length字段定义如温度值3.11V放大1000倍编码为整形两个字节0x0C 0x1C。介绍了TLV数据封装格式那么下面再详细介绍下其三大特点:2类型自描述每个TLV结构的第一部分为Type字段通常为1-4字节用于明确标识数据的语义和编码方式前面在介绍该字段的时候有说明了一下。但是该字段需要收发双方约定好这样就诞生了类型映射表。类型映射表Type值通过预定义的协议规范或动态协商如设备握手阶段确定接收方根据Type值选择对应的解析逻辑。 若Type值与实际数据格式不匹配例如Type声明为整数但Value为字符串接收方可直接报错。 这样的话就无需外部元数据数据本身携带类型信息解析器无需依赖额外的协议文档或配置文件现在挺多高级一点的序列化工具都需要使用工具等麻烦。在兼容性方面不同设备或协议版本可以通过扩展Type定义如预留私有Type范围实现兼容旧设备可忽略未知Type。同样你进行协议升级的时候只需定义新Type值如0x04表示PM2.5旧设备可跳过未知字段新设备解析新数据当前前提是你需要定义较多的type字段。3动态变长紧随Type后的Length字段长度并不是固定的通常为1-4字节够了它主要是用于声明Value部分的字节长度。例如若Value是4字节整数Length0x04若Value是可变长字符串HelloLength0x05当然也可以更加灵活的编码Length字段的字节数可根据协议设计动态调整。短数据≤255字节Length用1字节表示长数据如固件包Length用4字节表示这样一方面能够节省避免固定长度字段的填充浪费另一方面可以支持可变数据以适应物联网场景中数据长度多变的需求如传感器数据、配置参数、日志文本。不知道大家平时用过流式传输没通过Length提前预知数据边界无需等待完整数据包做到接收方可边接收边解析数据。4高效二进制编码TLV整体以二进制字节流传输而非文本格式如JSON、XML。而且在协议约定中采用的是一种紧凑编码规则比如:整数使用最小字节数如0x7F以内用1字节超过则用2字节浮点数采用IEEE 754标准压缩枚举值直接用单字节表示等等可以做到无需转换直接按字节偏移读取数据在资源受限平台大家确实比较钟爱。按照TLV的数据封装自定义协议基本上能够满足大部分嵌入式应用场景了。