通信帧结构
帧头2byte | 帧长度2byte | 通信类型2byte | 端口1byte | 帧载荷n byte | 校验和1byte | 帧尾2byte |
---|---|---|---|---|---|---|
0x6B66 | — | — | 0x1E | 结构体内容 | — | 0x7B70 |
如图所示,通信帧结构包括帧头子域、帧长度子域、端口子域、通信类型子域、帧载荷子域、校验和子域以及帧尾子域。其中,数据载荷子域的字节数n是根据不同的数据帧结构变化的。 注:
- 解析及封装均为二进制格式。
- 所有信息传输时,低字节在前,高字节在后(大端格式)。
- 帧长度子域值为除帧头、帧尾外实际数据帧长度。
- 校验和:从帧头0x6B66开始累加到校验和子域之前,包括帧头字节,(数据校验是对原始数据校验,非转义数据)。
- 端口:0x1E。
- 数据帧中帧头字节处理方法:特征字定义为:0x6B、0x99、0x7B。(这里的数据帧指帧中除去帧头帧尾的区域) 组包:数据帧中出现0x6B时,将其替换为0x99 0x94(0x6B的取反);数据帧中出现0x99时,替换为0x99 0x66;数据帧中出现0x7B时,替换为0x99 0x84。上述情况下,帧长度子域、帧序号、端口子域、数据载荷、校验和中出现特征字时,需要替换。 解包:首先查找帧头;其次,找到帧头后,分析数据帧中如果出现0x99,分析后面一个字节的数据如果不是0x94、0x66或者0x84中任何一个时,该帧出错,可以丢弃;如果是上述三个字节中的一个,就可以准确恢复,直到找到帧尾0x6A69结束,并完成和校验;最后,校验帧长度。如果均正确,则可以得到该正确的数据帧。