fix: DG430 协议校验 off-by-one,payload 范围修正
This commit is contained in:
17
src/dg430.py
17
src/dg430.py
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user