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/netty/client/NettyClient.java | 87 ++++++++++++++++++++++++++++++++++++++----- 1 files changed, 76 insertions(+), 11 deletions(-) diff --git a/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/netty/client/NettyClient.java b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/netty/client/NettyClient.java index 0237e60..4fb8ea5 100644 --- a/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/netty/client/NettyClient.java +++ b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/netty/client/NettyClient.java @@ -1,9 +1,14 @@ package com.ruoyi.dataInterchange.netty.client; -import com.ruoyi.dataInterchange.netty.server.NettyHandle; +import com.ruoyi.dataInterchange.util.jtt809.common.ByteArrayUtil; +import com.ruoyi.dataInterchange.util.jtt809.common.Jtt809Constant; +import com.ruoyi.dataInterchange.util.jtt809.common.Jtt809Util; import com.ruoyi.dataInterchange.util.jtt809.decoder.Jtt809Decoder; import com.ruoyi.dataInterchange.util.jtt809.encoder.Jtt809Encoder; +import com.ruoyi.dataInterchange.util.jtt809.gnsscenter.GnssCenterService; import io.netty.bootstrap.Bootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; @@ -11,8 +16,6 @@ import io.netty.handler.timeout.IdleStateHandler; import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.TimeUnit; /** @@ -30,8 +33,6 @@ private int port; - - public NettyClient(String host, int port) { this.host = host; this.port = port; @@ -40,6 +41,7 @@ /** * 执行启动连接 + * * @throws Exception */ public void start(int code) throws Exception { @@ -62,9 +64,9 @@ // 编码器 pipeline.addLast("encoder", new Jtt809Encoder()); // 空闲检测处理器 触发空闲状态事件 读空闲:5秒 写空闲:7秒 读写空闲:10秒 - pipeline.addLast(new IdleStateHandler(5,7,3, TimeUnit.SECONDS)); + pipeline.addLast(new IdleStateHandler(5, 7, 3, TimeUnit.SECONDS)); // 处理器 - pipeline.addLast("handler", new NettyHandle()); +// pipeline.addLast("handler", new NettyHandle()); } }); // • 调用Bootstrap.connect()来连接服务器 @@ -80,10 +82,73 @@ } public static void main(String[] args) { - try { - new NettyClient("221.182.45.100", 1000).start(1); - } catch (Exception e) { - throw new RuntimeException(e); + byte[] bytess = ByteArrayUtil.hexStr2Bytes("5B0000001F0000002B1002010A66F80100000000000000000000200C8E075D"); + ByteBuf msg = Unpooled.wrappedBuffer(bytess); + + byte[] readableBytes = new byte[msg.readableBytes()]; + msg.readBytes(readableBytes); + // 反转义处理 + byte[] bytes = Jtt809Util.unescape(readableBytes); + ByteBuf byteBuf = Unpooled.wrappedBuffer(bytes); + // 判断包头 + if (byteBuf.readByte() != Jtt809Constant.PACKET_HEAD_FLAG) { + byteBuf.resetReaderIndex(); + 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(); + // 协议版本号标识 + 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; +// try { +// time = DateUtils.parseDate(date, "dd-MM-yyyy HH:mm:ss").getTime(); +// } 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); + } + ByteBuf buf = Unpooled.wrappedBuffer(body); + int result = buf.readByte(); + int verifyCode = buf.readInt(); + // 校验码 + int crcCode = byteBuf.readUnsignedShort(); + //{"result":0,"verifyCode":658} } } -- Gitblit v1.7.1