From 4cd520ab788c09c4cebbb923f9e16001068a3896 Mon Sep 17 00:00:00 2001 From: lzh Date: Thu, 22 Jan 2026 10:10:09 +0800 Subject: [PATCH] =?UTF-8?q?fix(iot-gateway):=20=E5=85=BC=E5=AE=B9=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=AB=AF=E6=B6=88=E6=81=AF=E4=BD=93=E9=95=BF=E5=BA=A6?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E4=B8=8D=E5=87=86=E7=A1=AE=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改 JT808 解码器,采用更宽松的消息体长度处理策略: - 使用实际可用的长度(expected 与 actual 取最小值) - 将长度差异日志降为 DEBUG 级别 - 继续解析消息而不是直接丢弃 原因:部分设备端计算消息体长度时存在偏差,导致位置上报等消息被跳过。 Co-Authored-By: Claude Opus 4.5 --- .../iot/gateway/codec/jt808/Jt808Decoder.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/codec/jt808/Jt808Decoder.java b/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/codec/jt808/Jt808Decoder.java index a583301..b6ae4fd 100644 --- a/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/codec/jt808/Jt808Decoder.java +++ b/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/codec/jt808/Jt808Decoder.java @@ -56,18 +56,16 @@ public class Jt808Decoder { return ret; } - if (expectedBodyLength > actualAvailableLength) { - log.warn("[bytes2PackageData][消息体长度不匹配: 头部声明={}, 实际可用={}, 数据总长度={}, 消息ID=0x{}]", - expectedBodyLength, actualAvailableLength, data.length, + // 使用实际可用的长度处理(兼容设备端长度计算不准确的情况) + int actualBodyLength = Math.min(expectedBodyLength, actualAvailableLength); + if (expectedBodyLength != actualAvailableLength) { + log.debug("[bytes2PackageData][消息体长度差异: 头部声明={}, 实际可用={}, 使用={}, 消息ID=0x{}]", + expectedBodyLength, actualAvailableLength, actualBodyLength, Integer.toHexString(msgHeader.getId())); - // 使用 null 标记长度不匹配(区别于合法的空消息体如心跳) - ret.setBodyBytes(null); - ret.setCheckSum(data[data.length - 1]); - return ret; } - byte[] bodyBytes = new byte[msgHeader.getBodyLength()]; - System.arraycopy(data, msgBodyByteStartIndex, bodyBytes, 0, bodyBytes.length); + byte[] bodyBytes = new byte[actualBodyLength]; + System.arraycopy(data, msgBodyByteStartIndex, bodyBytes, 0, actualBodyLength); ret.setBodyBytes(bodyBytes); // 3. 解析校验码