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<HexPacket> 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<DellGngga> dellGnggaParser = ThreadLocal.withInitial(DellGngga::new);
|
private static final ThreadLocal<XTB> 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);
|
|
}
|
|
|
|
}
|