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. 解析校验码