一、公式拆解
• 帧头长度:固定长度,用于标识报文起始位置(如 0xAA 0x55)。
• 数据长度:动态字段,表示有效数据的字节数(如 uint16_t data_len)。
• 剩余长度:校验信息(如 CRC16)、其他元数据(如时间戳、版本号)等非数据部分的长度总和。
二、报文分层结构与功能说明
字段 | 功能 |
帧头 | 标识报文起始,通常为固定字节(如 `0xAA55`),用于接收方同步数据流 |
数据长度 | 声明后续有效数据的字节数,接收方据此分割数据流,避免粘包问题 |
有效数据 | 实际传输的负载内容(如传感器数据、控制指令等),长度由数据长度字段指定 |
校验信息 | 校验码(如 CRC32、异或校验),用于验证数据完整性,防止传输错误或篡改 |
其他信息 | 可选字段,可能包含协议版本、时间戳、设备 ID 等辅助信息 |
三、报文排列方式与设计逻辑
1. 固定头尾嵌套:
• 每个子帧均以帧头开始,校验信息结束,形成独立的数据单元(类似 TLVP 格式)。
• 示例结构:
[帧头][数据长度][其他信息][有效数据][校验信息]
2. 动态扩展性:
• 通过“其他信息”字段支持协议扩展,例如添加加密标识或优先级标志。
• 数据长度字段使得有效数据部分可动态调整,适应不同应用场景需求。
3. 校验冗余设计:
• 每层子帧均包含独立校验信息,提升传输可靠性(如逐帧校验而非全局校验)。
四、典型应用场景示例
假设需要传输一包传感器数据(温度、湿度),报文设计如下:
帧头(2B) | 数据长度(2B) | 协议版本(1B) | 温度(4B) | 湿度(4B) | CRC16(2B)
• 总长度计算:
2(帧头) + 2(数据长度) + 1(协议版本) + 4(温度) + 4(湿度) + 2(CRC16) = 15 Bytes
• 数据长度字段值:
1(协议版本) + 4(温度) + 4(湿度) = 9 Bytes