| | |
| | | private static final AtomicBoolean isRunning = new AtomicBoolean(false); |
| | | private static final ExecutorService parserExecutor = Executors.newSingleThreadExecutor(); |
| | | private static Thread parserThread; |
| | | private static boolean a1=true; |
| | | |
| | | // 报文存储结构 |
| | | public static class HexPacket { |
| | |
| | | this.hexData = hexData; |
| | | this.timestamp = timestamp; |
| | | } |
| | | |
| | | public String getIp() { |
| | | return ip; |
| | | } |
| | | |
| | | public int getPort() { |
| | | return port; |
| | | } |
| | | |
| | | public String getHexData() { |
| | | return hexData; |
| | | } |
| | | |
| | | public long getTimestamp() { |
| | | return timestamp; |
| | | } |
| | | } |
| | | |
| | | // 接收端存储报文(UDPPortAReceiver中调用) |
| | | public static void storePacket(String ip, int port, String hexData) { |
| | | if(a1) { |
| | | startProcessing(); |
| | | a1=false; |
| | | } |
| | | if (packetQueue.size() < 100000) { // 限制队列大小防止OOM |
| | | packetQueue.offer(new HexPacket(ip, port, hexData, System.currentTimeMillis())); |
| | | } |
| | |
| | | |
| | | try { |
| | | // 转换HEX为字节数据 |
| | | byte[] rawData = PacketParser.hexStringToBytes(packet.hexData); |
| | | byte[] rawData = PacketParser.hexStringToBytes(packet.hexData); |
| | | String ip=packet.getIp(); |
| | | int port=packet.getPort(); |
| | | // 追加到缓冲区并解析 |
| | | bufferManager.appendData(rawData, rawData.length); |
| | | List<PacketParser.DataPacket> parsedPackets = bufferManager.parsePackets(); |
| | |
| | | // 根据包头类型路由到不同解析器 |
| | | switch (p.getPacketType()) { |
| | | case 0x01: |
| | | processType01(p);break; |
| | | processType01(p,ip,port);break; |
| | | case 0x02: |
| | | processType02(p);break; |
| | | processType02(p,ip,port);break; |
| | | |
| | | default: |
| | | System.err.println("未知包类型: " + p.getPacketType()); |
| | |
| | | } |
| | | |
| | | // 示例解析方法(需根据实际协议实现) |
| | | private static void processType01(PacketParser.DataPacket packet) { |
| | | String hexData = PacketParser.bytesToHexString(packet.getPacket()); |
| | | Dell55AA01Parser.parse(hexData); |
| | | private static void processType01(PacketParser.DataPacket packet,String ip,int port) { |
| | | String hexData = PacketParser.bytesToHexString(packet.getPacket()); |
| | | Dell55AA01Parser.parse(hexData,ip,port); |
| | | } |
| | | |
| | | private static void processType02(PacketParser.DataPacket packet) { |
| | | private static void processType02(PacketParser.DataPacket packet,String ip,int port) { |
| | | System.out.println("处理55AA02包: " + packet); |
| | | // 实际业务逻辑 |
| | | } |