fix: DG430 协议校验 off-by-one,payload 范围修正

This commit is contained in:
wangfq
2026-05-27 10:25:40 +08:00
parent a10d176f68
commit bcd4cc6a8d

View File

@@ -65,11 +65,11 @@ def verify_packet(data: bytes) -> bool:
return False return False
length = data[2] length = data[2]
expected_len = 1 + 1 + 1 + length + 1 + 1 # STX + ADDR + LEN + DATA + XOR + SUM expected_len = 1 + 1 + 1 + length + 1 + 1 # STX + ADDR + LEN + DATA(LEN) + XOR + SUM
if len(data) != expected_len: if len(data) != expected_len:
return False return False
payload_end = 4 + length # STX(1) + ADDR(1) + LEN(1) + CMD(1) + DATA(LEN-1) payload_end = 3 + length # 校验范围 [ADDR .. DATA末尾]
actual_xor = _xor_checksum(data, 1, payload_end) actual_xor = _xor_checksum(data, 1, payload_end)
actual_sum = _sum_checksum(data, 1, payload_end) actual_sum = _sum_checksum(data, 1, payload_end)
@@ -91,7 +91,7 @@ def hex_str_to_bytes(hex_str: str) -> bytes:
def parse_b2_status(data: bytes) -> DG430Status | None: def parse_b2_status(data: bytes) -> DG430Status | None:
"""解析 0xB2 状态上报包 """解析 0xB2 状态上报包
格式: STX | ADDR | LEN(0x18=24) | 0xB2 | 20字节状态内容 | XOR | SUM 格式: STX | ADDR | LEN | CMD | DATA(LEN-1 bytes) | XOR | SUM
""" """
if not verify_packet(data): if not verify_packet(data):
logger.warning("DG430 数据包校验失败") logger.warning("DG430 数据包校验失败")
@@ -103,7 +103,10 @@ def parse_b2_status(data: bytes) -> DG430Status | None:
logger.debug(f"非 B2 指令: 0x{cmd:02X}") logger.debug(f"非 B2 指令: 0x{cmd:02X}")
return None return None
payload = data[4:24] # 20 字节状态内容 payload = data[4:3 + data[2]] # DATA = LEN - 1 bytes (CMD 占位置 3)
if len(payload) < 20:
logger.warning(f"B2 数据长度不足: {len(payload)} < 20")
return None
# 设备型号 # 设备型号
dev_model = payload[0] # 1=PD132, 2=DLD110 dev_model = payload[0] # 1=PD132, 2=DLD110
@@ -125,9 +128,9 @@ def parse_b2_status(data: bytes) -> DG430Status | None:
enter_dist = _le16(payload, 13) enter_dist = _le16(payload, 13)
exit_dist = _le16(payload, 15) exit_dist = _le16(payload, 15)
# 速度 dm/s # 速度 dm/s (V2.0.2 新增)
enter_speed = _le16(payload, 17) enter_speed = _le16(payload, 17) if len(payload) >= 19 else 0
exit_speed = _le16(payload, 19) exit_speed = _le16(payload, 19) if len(payload) >= 21 else 0
return DG430Status( return DG430Status(
addr=addr, addr=addr,