From f56262ee1cb3c554878984e3536ab55a298bdedf Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期二, 11 三月 2025 09:02:16 +0800 Subject: [PATCH] 修改809对接bug --- ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/jtt809/decoder/Jtt809Decoder.java | 136 ++++++++++++++++++++++---------------------- 1 files changed, 68 insertions(+), 68 deletions(-) diff --git a/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/jtt809/decoder/Jtt809Decoder.java b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/jtt809/decoder/Jtt809Decoder.java index debe117..226cce5 100644 --- a/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/jtt809/decoder/Jtt809Decoder.java +++ b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/jtt809/decoder/Jtt809Decoder.java @@ -4,16 +4,15 @@ import com.ruoyi.dataInterchange.util.jtt809.common.Jtt809Constant; import com.ruoyi.dataInterchange.util.jtt809.common.Jtt809Util; import com.ruoyi.dataInterchange.util.jtt809.gnsscenter.GnssCenterService; -import com.ruoyi.dataInterchange.util.jtt809.packet.common.OuterPacket;import io.netty.buffer.ByteBuf; +import com.ruoyi.dataInterchange.util.jtt809.packet.common.OuterPacket; +import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageDecoder; import io.netty.util.ReferenceCountUtil; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.time.DateUtils; -import java.text.ParseException; import java.util.List; /** @@ -21,54 +20,54 @@ */ @Slf4j public class Jtt809Decoder extends MessageToMessageDecoder<ByteBuf> { - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception { - // 写个判断,线上环境就不需要执行 ByteBufUtil.hexDump - if (log.isDebugEnabled()) { - log.debug("收到一条消息:{}5d", ByteBufUtil.hexDump(msg)); - } - byte[] readableBytes = new byte[msg.readableBytes()]; - msg.readBytes(readableBytes); - log.info("接收到数据包, packetLen : {}, packet : {}", readableBytes.length, ByteArrayUtil.bytes2HexStr(readableBytes)); - // 反转义处理 - byte[] bytes = Jtt809Util.unescape(readableBytes); - ByteBuf byteBuf = Unpooled.wrappedBuffer(bytes); - log.info("反转义后数据包, packetLen : {}, packet : {}", bytes.length, ByteArrayUtil.bytes2HexStr(bytes)); - // 判断包头 - if (byteBuf.readByte() != Jtt809Constant.PACKET_HEAD_FLAG) { - byteBuf.resetReaderIndex(); - log.warn("消息包头错误: {}5d", ByteBufUtil.hexDump(byteBuf)); - return; - } - // crc校验 + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception { + // 写个判断,线上环境就不需要执行 ByteBufUtil.hexDump + if (log.isDebugEnabled()) { + log.debug("收到一条消息:{}5d", ByteBufUtil.hexDump(msg)); + } + byte[] readableBytes = new byte[msg.readableBytes()]; + msg.readBytes(readableBytes); + log.info("接收到数据包, packetLen : {}, packet : {}", readableBytes.length, ByteArrayUtil.bytes2HexStr(readableBytes)); + // 反转义处理 + byte[] bytes = Jtt809Util.unescape(readableBytes); + ByteBuf byteBuf = Unpooled.wrappedBuffer(bytes); + log.info("反转义后数据包, packetLen : {}, packet : {}", bytes.length, ByteArrayUtil.bytes2HexStr(bytes)); + // 判断包头 + if (byteBuf.readByte() != Jtt809Constant.PACKET_HEAD_FLAG) { + byteBuf.resetReaderIndex(); + log.warn("消息包头错误: {}5d", ByteBufUtil.hexDump(byteBuf)); + return; + } + // crc校验 // if (!Jtt809Util.validate(byteBuf)) { // return; // } - - /* 解析外层包 */ - // 长度 - long length = byteBuf.readUnsignedInt(); - // 长度校验, 反转义之后数组加上包头和包尾长度与解析出来的长度对比; - // 因为数据长度不包含校验码,而此时解析出来的数据不包含头尾标识,刚好都是2个字节,所以两个长度应该相等 - if (length != bytes.length) { - log.warn("消息长度校验错误,报文解析出来长度为 {}, 实际可解析的长度为 {}", length, bytes.length); - return; - } - // 报文序列号 - long sn = byteBuf.readUnsignedInt(); - // 业务数据类型 - int id = byteBuf.readUnsignedShort(); - // 下级平台接入码 - int gnsscenterId = byteBuf.readInt(); - ctx.channel().attr(Jtt809Constant.NettyAttribute.GNSS_CENTER_ID).setIfAbsent(String.valueOf(gnsscenterId)); - // 协议版本号标识 - String version = "v" + byteBuf.readByte() + "." + byteBuf.readByte() + "." + byteBuf.readByte(); - // 报文加密标识位 - byte encryptFlag = byteBuf.readByte(); - // 数据加密解密的密匙 - long encryptKey = byteBuf.readUnsignedInt(); - // 2019版 + + /* 解析外层包 */ + // 长度 + long length = byteBuf.readUnsignedInt(); + // 长度校验, 反转义之后数组加上包头和包尾长度与解析出来的长度对比; + // 因为数据长度不包含校验码,而此时解析出来的数据不包含头尾标识,刚好都是2个字节,所以两个长度应该相等 +// if (length != bytes.length) { +// log.warn("消息长度校验错误,报文解析出来长度为 {}, 实际可解析的长度为 {}", length, bytes.length); +// return; +// } + // 报文序列号 + long sn = byteBuf.readUnsignedInt(); + // 业务数据类型 + int id = byteBuf.readUnsignedShort(); + // 下级平台接入码 + int gnsscenterId = byteBuf.readInt(); + ctx.channel().attr(Jtt809Constant.NettyAttribute.GNSS_CENTER_ID).setIfAbsent(String.valueOf(gnsscenterId)); + // 协议版本号标识 + String version = "v" + byteBuf.readByte() + "." + byteBuf.readByte() + "." + byteBuf.readByte(); + // 报文加密标识位 + byte encryptFlag = byteBuf.readByte(); + // 数据加密解密的密匙 + long encryptKey = byteBuf.readUnsignedInt(); + // 2019版 // String date = byteBuf.readByte() + "-" + byteBuf.readByte() + "-" + byteBuf.readShort() + " " + // byteBuf.readByte() + ":" + byteBuf.readByte() + ":" + byteBuf.readByte(); // long time = 0; @@ -77,24 +76,25 @@ // } catch (ParseException e) { // log.warn("日期 [{}] 解析错误", date); // } - - // 消息体 - byte[] body; - if (encryptFlag == 1) { - byte[] encryptedBytes = new byte[byteBuf.readableBytes() - 2]; - byteBuf.readBytes(encryptedBytes); - // 解密 - int[] param = GnssCenterService.getInstance().getDecryptParam(gnsscenterId); - Jtt809Util.decrypt(param[0], param[1], param[2], encryptKey, encryptedBytes); - body = encryptedBytes; - } else { - body = new byte[byteBuf.readableBytes() - 2]; - byteBuf.readBytes(body); - } - // 校验码 - int crcCode = byteBuf.readUnsignedShort(); - ReferenceCountUtil.release(byteBuf); - out.add(new OuterPacket(length, sn, id, gnsscenterId, version, encryptFlag, encryptKey, body, crcCode)); - } - + + // 消息体 + byte[] body; + if (encryptFlag == 1) { + byte[] encryptedBytes = new byte[byteBuf.readableBytes() - 2]; + byteBuf.readBytes(encryptedBytes); + // 解密 + int[] param = GnssCenterService.getInstance().getDecryptParam(gnsscenterId); + Jtt809Util.decrypt(param[0], param[1], param[2], encryptKey, encryptedBytes); + body = encryptedBytes; + } else { + body = new byte[byteBuf.readableBytes() - 2]; + byteBuf.readBytes(body); + } + // 校验码 + int crcCode = byteBuf.readUnsignedShort(); + ReferenceCountUtil.release(byteBuf); + out.add(new OuterPacket(length, sn, id, gnsscenterId, version, encryptFlag, encryptKey, body, crcCode)); + } + + } -- Gitblit v1.7.1