保留抓取边界和方向
从授权抓包开始,记录传输方向、端点角色、时间戳和 TCP 序列上下文。在保持字节长度的同时脱敏终端标识、坐标和业务载荷。单个 TCP 段不一定是一条应用报文:一条报文可能跨段,一个段也可能包含多条报文。查找 0x7e 边界前应按连接和序列重组字节。
把每对分隔符视为候选。将不完整尾部字节保留到下一段流,并考虑抓包丢失和重传。只有转义内容、声明消息体长度和校验内部一致后,候选才应进入字段解析。
先反转义,再计算校验和字段偏移
删除外部 0x7e 分隔符并还原保留字节转义,消息头、消息体和传输 BCC 才呈现逻辑字节序列。对反转义后的消息头和消息体计算 XOR,并排除收到的 BCC。线路转义发生在生成 BCC 之后,因此一旦出现保留值,对转义线路字节校验就会得到不同结果。
BCC 不匹配证明字节不一致,但不能定位。应比较发送端和接收端准确字节范围,检查 TCP 丢失或重复,并确认排除了分隔符和收到的校验字节。保留一个同时包含 0x7e 和 0x7d 的已知载荷,作为转义与校验回归向量。
让消息头属性决定布局
先读取消息 ID 和两字节消息体属性字。消息体长度、加密、分包和版本标志决定公共消息头剩余布局。旧版和带版本标识消息头使用不同终端标识宽度,分包还会增加总包数和包序号字段。因此固定偏移可能移动消息体,却仍产生看似合理的值。
将计算消息头长度加声明消息体长度与 BCC 前逻辑字节比较;不一致就停止。应确认合法标准版本和项目规范,而不是选择刚好能让样例匹配的布局。压缩 BCD 标识应保留前导零,并明确检查协议版本字节。
分层解析 0x0200
0x0200 基础消息体为 28 字节,包含报警、状态、纬度、经度、海拔、速度、方向和 BCD 时间。坐标应结合缩放和状态字中的半球位解释。定位有效性、GNSS 状态和车辆状态提供必要背景;只有数值坐标不能证明定位有效。
基础消息体后的字节组成可选附加信息记录。验证每个 ID-长度-值边界,遇到截断即停止。只命名所选版本和厂商规范中确认的 ID,并把未知值保留为原始 Hex。位置时间和状态应与受控终端事件比较,而不是不相关的平台数据。
把故障转化为回归样例
对每个确认缺陷,保存脱敏输入、预期边界、解析消息头、BCC 和相关消息体字段,并配套一条因预期原因失败的故意损坏样例。这样可以防止后续解析器修改让错误报文看似有效,同时覆盖不同版本和可选布局。
- 应用分帧前先重组传输字节。
- 计算 BCC 或消息体偏移前先反转义。
- 根据标志和合法版本选择消息头布局。