帧格式
定义消息的边界和基本结构,确保接收端能完整提取一帧数据。主要用于“ 一条消息的边界 ”识别。帧格式在外层,定义报文头、长度、类型。
TLV (Type-Length-Value)
TLV 是一种常用的数据编码格式:
- T (Type):字段类型,表示这段数据的含义
- L (Length):数据长度,表示这段数据有多长
- V (Value):具体的数据内容
它的核心目标是:
- 在字节流中自描述每一段数据的类型和长度
- 方便灵活扩展,新增字段不会破坏旧协议
基本结构:
| Type | Length | Value |
|---|---|---|
| 1字节 | 2字节 | Length字节数据 |
Type:通常 1 个字节(可以扩展到 2 字节)
Length:表示 Value 的字节数,常用 1–2 字节
Value:实际数据,可以是字符串、数值、二进制块等
LV (Length-Value)
LV (Length-Value) 是一种非常简单的帧格式:
- L (Length):表示数据长度
- V (Value):实际数据内容
它的主要功能是解决帧边界问题,让接收端知道一帧数据从哪里开始、在哪里结束。
基本结构:
| Length | Value |
|---|---|
| 2字节 | Length字节数据 |
Length:通常 1–2 个字节,表示 Value 的字节数
Value:实际传输的数据,长度由 Length 决定
Delimited
Delimited(分隔符帧格式)指的是用特定的分隔符(Delimiter)标记一帧数据的开始或结束,从而让接收端知道一条消息在哪里结束,下一条从哪里开始。常见分隔符如下:
- 文本协议:"\n"、"\r\n"(如 HTTP 请求头、CSV 文件)
- 二进制协议:特定字节 0x7E(如 HDLC 协议用 0x7E 标记帧边界)
基本结构:
[ Data1 ] D
[ Data2 ] D
[ Data3 ] D
Data:一帧数据
D (Delimiter):分隔符,标记帧的边界
帧格式总结
| 帧结构 | 优点 | 缺点 | 串口适配性 | 典型场景 |
|---|---|---|---|---|
| Delimited | 实现最简单,用分隔符标记帧尾 | 需要转义,数据不能含分隔符 | 适合简单命令传输 | 文本协议、简单 AT 命令 |
| LV | 低开销,解析简单,性能好 | 不能灵活扩展,字段固定 | 适合固定结构数据 | Modbus RTU、gRPC Frame |
| TLV | 自描述性强,灵活,易扩展 | 帧头比 LV 稍大,解析略复杂 | 适合复杂、可扩展协议 | BLE GATT、SNMP、IoT 自定义协议 |
根据不同的应用场景有不同的选择:
| 需求场景 | 推荐帧结构 | 原因 |
|---|---|---|
| 只传输简单命令或文本数据 | Delimited | 实现简单,调试方便 |
| 固定字段、性能优先 | LV | 长度前缀+负载,结构简单 |
| 多字段、未来可能扩展 | TLV | Type+Length+Value 自描述灵活 |
| 二进制+高可靠+复杂协议 | TLV + CRC 校验 | 易扩展、可校验数据完整性 |
在工业控制、物联网里,常用的组合是:
[ 起始符 ] + [ 长度 ] + [ Type ] + [ Value ] + [ CRC ]
- 起始符:标记帧开始,避免同步丢失
- 长度:明确帧结束位置
- Type+Value:支持多字段、可扩展
- CRC:保证数据可靠
这样结合了 Delimited + LV + TLV 的优点,最通用,也最安全
数据序列化方案
定义帧内有效载荷数据如何编码成字节流,保证结构化数据可传输。将内存中的结构化数据(如对象、数组、字典等)转换为可存储、可传输的线性格式(通常是二进制流或文本字符串)的过程。
JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式, 基于键值对(key-value)表示数据 ,广泛用于前后端通信、配置文件、存储和物联网等场景。
示例:
{
"name": "Alice",
"age": 30,
"isStudent": false,
"scores": [95, 82, 77],
"address": {
"city": "New York",
"zip": "10001"
}
}
优点:
- 易于阅读和调试
- 跨语言支持广泛
- 与 JavaScript 原生对象映射简单
缺点:
- 体积较大:冗余键名,传输效率低
- 解析速度较慢:文本解析比二进制慢
- 类型有限:没有二进制数据类型,需要编码(如 Base64)
- 无严格 Schema:容易出现字段缺失或类型不匹配问题
BSON
BSON一种基于 JSON 语法设计的二进制数据格式,最早由 MongoDB 推出,核心目标是解决 JSON 文本格式在数据传输和存储中的效率问题(如体积过大、解析速度慢)。与纯文本的 JSON 不同,BSON 通过二进制编码优化了数据存储结构,同时保留了 JSON 的 “键值对” 核心逻辑,兼顾了可读性(可解析为 JSON)和性能。
支持数据类型:
| BSON 类型 | 对应 JSON 类型 | 说明 |
|---|---|---|
| Double | Number (浮点) | 64 位浮点数 |
| String | String | UTF-8 编码 |
| Object | Object | 嵌套文档 |
| Array | Array | 有序列表 |
| Binary data | - | 原生二进制数据 |
| ObjectId | - | MongoDB 特有唯一 ID |
| Boolean | Boolean | true/false |
| Date | - | 64 位整数,表示 UTC 时间戳 |
| Null | Null | 空值 |
| Int32 | Number | 32 位整数 |
| Int64 | Number | 64 位整数 |
| Decimal128 | Number | 高精度浮点数 |
示例:
{

最低0.47元/天 解锁文章
1542

被折叠的 条评论
为什么被折叠?



