package publicsWay; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; import dell55AAData.DellGngga; import dell55AAData.XTB; import java.util.regex.Matcher; import dell_system.MessageViewPanel; import dell_targets.Dell_tag; import targets.LocationTag; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class PacketProcessingSystemB { // Ḭ̈߳²È«µÄ±¨ÎÄ´æ´¢¶ÓÁУ¨¼¯ºÏA£© private static final ConcurrentLinkedQueue packetQueue = new ConcurrentLinkedQueue<>(); private static final AtomicBoolean isRunning = new AtomicBoolean(false); private static final ExecutorService parserExecutor = Executors.newSingleThreadExecutor(); private static Thread parserThread; private static boolean a1 = true; // ¿ÉÖØÓõÄDellGnggaʵÀý£¨Ḭ̈߳²È«£© private static final ThreadLocal dellGnggaParser = ThreadLocal.withInitial(DellGngga::new); private static final ThreadLocal dellXTB = ThreadLocal.withInitial(XTB::new); // ±¨ÎÄ´æ´¢½á¹¹ public static class HexPacket { public final String ip; public final int port; public final String hexData; public final long timestamp; public HexPacket(String ip, int port, String hexData, long timestamp) { this.ip = ip; this.port = port; 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())); } } // Æô¶¯½âÎöϵͳ public static void startProcessing() { if (isRunning.get()) return; isRunning.set(true); parserThread = new Thread(() -> { while (isRunning.get()) { HexPacket packet = packetQueue.poll(); if (packet == null) { Thread.yield(); // ¶ÓÁÐΪ¿ÕʱÈóöCPU continue; } try { String receivedata = packet.hexData; String ip = packet.getIp(); int port = packet.getPort(); processData(receivedata, ip, port); } catch (Exception e) { System.err.println("½âÎö´íÎó: " + e.getMessage()); } } }); parserThread.setDaemon(true); parserThread.start(); } // Í£Ö¹½âÎöϵͳ public static void stopProcessing() { isRunning.set(false); parserExecutor.shutdownNow(); if (parserThread != null) { parserThread.interrupt(); } } public static void processData(String receivedata, String ip, int port) { // È¥µô»Ø³µ»»Ðзû receivedata = receivedata.replaceAll("[\\r\\n]+", ""); // ת´óд receivedata = receivedata.toUpperCase(); // ¶¨ÒåÕýÔò±í´ïʽ£¬Æ¥ÅäÒÔ $GNGGA¡¢$XTB¡¢$SSGGA¡¢$GBGGA »ò 55AA ¿ªÍ·µÄÊý¾Ý String regex = "(\\$GNGGA[^$]*|\\$XTB[^$]*|\\$SSGGA[^$]*|\\$GBGGA[^$]*|55AA[^$]*)"; // ʹÓÃÕýÔò±í´ïʽ·Ö¸î×Ö·û´® Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(receivedata); // ±éÀúÆ¥Åäµ½µÄÊý¾Ý while (matcher.find()) { String data = matcher.group(1); if (data.startsWith("$GNGGA")) { handleGNGGA(data, ip, port); } else if (data.startsWith("$XTB")) { handleXTB(data, ip, port); } else if (data.startsWith("$SSGGA")) { handleSSGGA(data, ip, port); } else if (data.startsWith("$GBGGA")) { handleGBGGA(data, ip, port); } else if (data.startsWith("55AA")) { handle55AA(data, ip, port); } } } private static void handleGNGGA(String data, String ip, int port) {// ´¦Àí$GNGGAÊý¾Ý MessageViewPanel.showData(data, ip, port, 0, "UDPB", "GNGGA", "ALL"); // ʹÓÿÉÖØÓõĽâÎöÆ÷ʵÀý½âÎöÊý¾Ý dellGGA(data, ip,port); } private static void handleXTB(String data, String ip, int port) { // ´¦Àí$XTBÊý¾Ý MessageViewPanel.showData(data, ip, port, 0, "UDPB", "XTB", "ALL"); // ¾ßÌå½âÎöÂß¼­ dellXTB(data,ip,port) ; } private static void handleSSGGA(String data, String ip, int port) { // ´¦Àí$SSGGAÊý¾Ý MessageViewPanel.showData(data, ip, port, 0, "UDPB", "SSGGA", "ALL"); dellGGA(data, ip,port); // ¾ßÌå½âÎöÂß¼­ } private static void handleGBGGA(String data, String ip, int port) { // ´¦Àí$GBGGAÊý¾Ý MessageViewPanel.showData(data, ip, port, 0, "UDPB", "GBGGA", "ALL"); // ¾ßÌå½âÎöÂß¼­ dellGGA(data, ip,port); } private static void handle55AA(String data, String ip, int port) { // ´¦Àí55AAÊý¾Ý System.out.println("Handling 55AA: " + data); // ¾ßÌå½âÎöÂß¼­ } private static void dellGGA(String data, String ip, int port) { DellGngga parser = dellGnggaParser.get(); parser.parse(data); String utcTime= parser.getUtcTime(); String latitude = parser.getLatitude(); // »ñȡγ¶ÈÖµ String latHemisphere = parser.getLatHemisphere(); // »ñȡγ¶È°ëÇò£¨N»òS£© String longitude = parser.getLongitude(); // »ñÈ¡¾­¶ÈÖµ String lonHemisphere = parser.getLonHemisphere(); // »ñÈ¡¾­¶È°ëÇò£¨E»òW£© String quality = parser.getQuality(); // »ñÈ¡GPS¶¨Î»ÖÊÁ¿ String satellites = parser.getSatellites(); // »ñȡʹÓõÄÎÀÐÇÊýÁ¿ String hdop = parser.getHdop(); // »ñȡˮƽ¾«¶ÈÒò×Ó String altitude = parser.getAltitude(); // »ñÈ¡º£°Î¸ß¶È String altitudeUnit = parser.getAltitudeUnit(); // »ñÈ¡º£°Îµ¥Î» String geoidHeight = parser.getGeoidHeight(); // »ñÈ¡´óµØË®×¼Ãæ¸ß¶È String geoidHeightUnit = parser.getGeoidHeightUnit(); // »ñÈ¡´óµØË®×¼Ãæ¸ß¶Èµ¥Î» String differentialTime = parser.getDifferentialTime(); // »ñÈ¡²î·Öʱ¼ä String checksum = parser.getChecksum(); // »ñȡУÑéºÍ String deviceId = parser.getDeviceId(); // »ñÈ¡É豸ID String battery = parser.getBattery(); // »ñÈ¡µç³ØµçÁ¿ String signalStrength = parser.getSignalStrength(); // »ñÈ¡ÐźÅÇ¿¶È String reserve1 = parser.getReserve1(); // »ñÈ¡±£Áô×Ö¶Î1 String reserve2 = parser.getReserve2(); // »ñÈ¡±£Áô×Ö¶Î2 String reserve3 = parser.getReserve3(); // »ñÈ¡±£Áô×Ö¶Î3 String portStr = String.valueOf(port); // ½«¶Ë¿ÚºÅת»»Îª×Ö·û´® String time = EfficientTimeFormatter.getCurrentTimeFormatted(); Dell_tag.updateLocationTagProperty(deviceId, "utcTime",utcTime); Dell_tag.updateLocationTagProperty(deviceId, "deviceBattery",time); Dell_tag.updateLocationTagProperty(deviceId, "lastSatelliteSignalTime",time); Dell_tag.updateLocationTagProperty(deviceId, "gnGgaDataTime",time); Dell_tag.updateLocationTagProperty(deviceId, "latitude",latitude); Dell_tag.updateLocationTagProperty(deviceId, "longitude",longitude); Dell_tag.updateLocationTagProperty(deviceId, "satelliteQuality",quality); Dell_tag.updateLocationTagProperty(deviceId, "satelliteCount",satellites); Dell_tag.updateLocationTagProperty(deviceId, "altitude",altitude); Dell_tag.updateLocationTagProperty(deviceId, "ipAddress",ip); Dell_tag.updateLocationTagProperty(deviceId, "ipPort",portStr); Dell_tag.updateLocationTagProperty(deviceId, "onlineStatus","1"); Dell_tag.updateLocationTagProperty(deviceId, "isSatelliteDevice","1"); Dell_tag.updateLocationTagProperty(deviceId, "differentialTime",differentialTime); // ´´½¨TrackData¶ÔÏó²¢Ìí¼Óµ½ÅúÁ¿²åÈëÆ÷ LocationTag tag = Dell_tag.getTagByDeviceId(deviceId); String deviceName = tag != null ? tag.getDeviceName() : ""; String company = tag != null ? tag.getCompany() : ""; TrackData trackData = new TrackData( deviceId, deviceName, "", "", "", "", battery, utcTime, longitude, latitude, quality, satellites, hdop, altitude, geoidHeight, differentialTime, "GNGGA", company, time ); TrackDataBatchInserter.addTrackData(trackData); } private static void dellXTB(String data, String ip, int port) { String portStr = String.valueOf(port); // ½«¶Ë¿ÚºÅת»»Îª×Ö·û´® XTB parser = dellXTB.get(); parser.parse(data); String deviceId=parser.getDeviceId();// É豸±àºÅ String battery=parser.getBattery();// µçÁ¿ String version=parser.getVersion();// °æ±¾ºÅ String ccid=parser.getCcid(); // CCID String button=parser.getButton(); // °´¼ü String rtcmSource=parser.getRtcmSource(); Dell_tag.updateLocationTagProperty(deviceId, "ipAddress",ip); Dell_tag.updateLocationTagProperty(deviceId, "ipPort",portStr); Dell_tag.updateLocationTagProperty(deviceId, "RTKsource",rtcmSource); Dell_tag.updateLocationTagProperty(deviceId, "sosStatus",button); Dell_tag.updateLocationTagProperty(deviceId, "deviceCardNumber",ccid); Dell_tag.updateLocationTagProperty(deviceId, "deviceVersion",version); } }