From 2b756769ea4adad21332d8a294871712cd42cc3f Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期三, 26 十一月 2025 13:57:24 +0800
Subject: [PATCH] 优化了轮询逻辑注意有打印输出
---
src/publicway/SerialProtocolParser.java | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 112 insertions(+), 5 deletions(-)
diff --git a/src/publicway/SerialProtocolParser.java b/src/publicway/SerialProtocolParser.java
index 732c879..36ccf34 100644
--- a/src/publicway/SerialProtocolParser.java
+++ b/src/publicway/SerialProtocolParser.java
@@ -2,9 +2,12 @@
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+import java.util.Collections;
+import java.util.Set;
import chuankou.SerialPortService;
import chushihua.SlotManager;
@@ -54,6 +57,13 @@
// 瀵硅薄姹狅紝鍑忓皯瀵硅薄鍒涘缓
private final Object packetPoolLock = new Object();
+ // ==================== 鏂板锛氭暟鎹寘鍘婚噸缂撳瓨 ====================
+ private final Set<String> processedPacketCache = Collections.newSetFromMap(
+ new ConcurrentHashMap<String, Boolean>());
+ private static final int MAX_CACHE_SIZE = 1000;
+ private static final long CACHE_CLEANUP_INTERVAL = 60000; // 1鍒嗛挓娓呯悊涓�娆$紦瀛�
+ private long lastCacheCleanupTime = 0;
+
/**
* 鍚姩瑙f瀽鍣�
*/
@@ -64,9 +74,8 @@
isRunning = true;
- // 鍚姩鎵归噺澶勭悊锛堟瘡50ms澶勭悊涓�娆★級
- batchExecutor.scheduleAtFixedRate(this::batchProcess, 50, 50, TimeUnit.MILLISECONDS);
-
+ // 鍚姩鎵归噺澶勭悊锛堟瘡10ms澶勭悊涓�娆★級
+ batchExecutor.scheduleAtFixedRate(this::batchProcess, 10, 10, TimeUnit.MILLISECONDS);
processorThread = new Thread(this::processPackets, "Serial-Protocol-Parser");
processorThread.setDaemon(true);
processorThread.start();
@@ -106,6 +115,9 @@
// 娓呯┖闃熷垪鍜岀紦鍐插尯
clearQueues();
bufferPosition = 0;
+
+ // 娓呯┖鍘婚噸缂撳瓨
+ processedPacketCache.clear();
}
/**
@@ -203,6 +215,9 @@
// 瀹氭湡妫�鏌ュ唴瀛�
checkMemory();
+ // 瀹氭湡娓呯悊鍘婚噸缂撳瓨
+ cleanupPacketCache();
+
} catch (Exception e) {
System.err.println("鎵归噺澶勭悊鏁版嵁鏃跺彂鐢熷紓甯�: " + e.getMessage());
// 鍙戠敓寮傚父鏃堕噸缃姸鎬�
@@ -275,6 +290,26 @@
}
/**
+ * 娓呯悊鏁版嵁鍖呭幓閲嶇紦瀛�
+ */
+ private void cleanupPacketCache() {
+ long currentTime = System.currentTimeMillis();
+ if (currentTime - lastCacheCleanupTime < CACHE_CLEANUP_INTERVAL) {
+ return;
+ }
+
+ lastCacheCleanupTime = currentTime;
+
+ // 濡傛灉缂撳瓨澶у皬瓒呰繃闄愬埗锛屾竻绌虹紦瀛�
+ if (processedPacketCache.size() >= MAX_CACHE_SIZE) {
+ processedPacketCache.clear();
+ if (lunxun.DEBUG_ENABLED) {
+ SystemDebugDialog.appendAsciiData("鏁版嵁鍖呭幓閲嶇紦瀛樺凡娓呯┖锛屽綋鍓嶅ぇ灏�: " + processedPacketCache.size());
+ }
+ }
+ }
+
+ /**
* 澶勭悊缂撳啿鍖轰腑鐨勬暟鎹紝瑙f瀽瀹屾暣鏁版嵁鍖�
*/
private void processBuffer() {
@@ -318,6 +353,27 @@
// 鎻愬彇瀹屾暣鏁版嵁鍖�
byte[] packet = extractPacket(startIndex, totalPacketLength);
if (packet != null) {
+ // ==================== 鏂板锛氭暟鎹寘鍘婚噸妫�鏌� ====================
+ String packetHash = generatePacketHash(packet);
+ if (processedPacketCache.contains(packetHash)) {
+ // 璺宠繃閲嶅鏁版嵁鍖�
+ if (lunxun.DEBUG_ENABLED) {
+ SystemDebugDialog.appendAsciiData("璺宠繃閲嶅鏁版嵁鍖�: " + bytesToHex(packet));
+ }
+
+ // 绉诲姩缂撳啿鍖轰綅缃紝缁х画澶勭悊涓嬩竴涓寘
+ int remaining = bufferPosition - (startIndex + totalPacketLength);
+ if (remaining > 0) {
+ System.arraycopy(dataBuffer, startIndex + totalPacketLength, dataBuffer, 0, remaining);
+ }
+ bufferPosition = remaining;
+ processedCount++;
+ continue;
+ }
+
+ // 娣诲姞鍒板幓閲嶇紦瀛�
+ processedPacketCache.add(packetHash);
+
// 灏嗘暟鎹寘鏀惧叆闃熷垪渚涜В鏋�
if (!dataQueue.offer(packet)) {
// 闃熷垪宸叉弧锛岄噴鏀緋acket寮曠敤
@@ -339,6 +395,35 @@
}
/**
+ * 鐢熸垚鏁版嵁鍖呭搱甯屽�肩敤浜庡幓閲�
+ * 鍩轰簬鍏抽敭瀛楁锛氫富鏈哄湴鍧� + 鍗℃Ы鍦板潃 + 鍔熻兘鐮� + 鏁版嵁鍐呭
+ */
+ private String generatePacketHash(byte[] packet) {
+ if (packet == null || packet.length < 7) {
+ return "";
+ }
+
+ StringBuilder key = new StringBuilder(64);
+
+ // 娣诲姞鍗忚澶翠俊鎭�
+ key.append(packet[4] & 0xFF).append(":"); // 涓绘満鍦板潃 (浣嶇疆4)
+ key.append(packet[5] & 0xFF).append(":"); // 鍗℃Ы鍦板潃 (浣嶇疆5)
+ key.append(packet[6] & 0xFF).append(":"); // 鍔熻兘鐮� (浣嶇疆6)
+
+ // 娣诲姞鏁版嵁鍐呭鍝堝笇锛堟帓闄ゅ寘澶村拰CRC锛�
+ int dataStart = 7; // 鏁版嵁寮�濮嬩綅缃�
+ int dataEnd = packet.length - 2; // 鎺掗櫎CRC瀛楄妭
+
+ // 鍙栨暟鎹唴瀹圭殑鍓�20涓瓧鑺備綔涓哄搱甯屼緷鎹�
+ int hashLength = Math.min(dataEnd - dataStart, 20);
+ for (int i = dataStart; i < dataStart + hashLength && i < dataEnd; i++) {
+ key.append(String.format("%02X", packet[i]));
+ }
+
+ return key.toString();
+ }
+
+ /**
* 鎻愬彇鏁版嵁鍖咃紝閲嶇敤byte鏁扮粍鍑忓皯瀵硅薄鍒涘缓
*/
private byte[] extractPacket(int startIndex, int totalPacketLength) {
@@ -408,6 +493,7 @@
* 瑙f瀽鏁版嵁鍖呭苟鏍规嵁鍔熻兘鐮佽皟鐢ㄧ浉搴旀柟娉�
*/
private void parsePacket(byte[] packet) {
+ System.out.println("寮�濮嬭В鏋愭敹鍒扮殑鏁版嵁"+bytesToHex(packet)+"鏃堕棿"+TimestampUtil.getTimestamp());
if (packet == null || packet.length < MIN_PACKET_LENGTH) {
return;
}
@@ -418,6 +504,7 @@
byte hostAddress = packet[4]; // 涓绘満鍦板潃
byte slotAddress = packet[5]; // 鍗℃Ы鍦板潃
byte functionCode = packet[6]; // 鍔熻兘鐮�
+
// 鏁版嵁闀垮害 (浠庡崗璁腑璇诲彇)
int dataLength = ((packet[2] & 0xFF) << 8) | (packet[3] & 0xFF);
@@ -529,14 +616,16 @@
* 鑾峰彇瑙f瀽鍣ㄧ姸鎬佷俊鎭�
*/
public String getStatusInfo() {
- return String.format("涓插彛瑙f瀽鍣ㄧ姸鎬�: %s, 闃熷垪澶у皬: %d/%d, 鎵归噺闃熷垪: %d/%d, 缂撳啿鍖�: %d/%d",
+ return String.format("涓插彛瑙f瀽鍣ㄧ姸鎬�: %s, 闃熷垪澶у皬: %d/%d, 鎵归噺闃熷垪: %d/%d, 缂撳啿鍖�: %d/%d, 鍘婚噸缂撳瓨: %d/%d",
isRunning ? "杩愯涓�" : "宸插仠姝�",
dataQueue.size(),
dataQueue.remainingCapacity() + dataQueue.size(),
batchQueue.size(),
batchQueue.remainingCapacity() + batchQueue.size(),
bufferPosition,
- dataBuffer.length);
+ dataBuffer.length,
+ processedPacketCache.size(),
+ MAX_CACHE_SIZE);
}
/**
@@ -554,5 +643,23 @@
clearQueues();
bufferPosition = 0;
hexBuilder.setLength(0);
+ processedPacketCache.clear();
+ }
+
+ /**
+ * 鎵嬪姩娓呯┖鏁版嵁鍖呭幓閲嶇紦瀛橈紙鐢ㄤ簬璋冭瘯鎴栫壒娈婃儏鍐碉級
+ */
+ public void clearPacketCache() {
+ processedPacketCache.clear();
+ if (lunxun.DEBUG_ENABLED) {
+ SystemDebugDialog.appendAsciiData("鏁版嵁鍖呭幓閲嶇紦瀛樺凡鎵嬪姩娓呯┖");
+ }
+ }
+
+ /**
+ * 鑾峰彇鍘婚噸缂撳瓨澶у皬锛堢敤浜庣洃鎺э級
+ */
+ public int getPacketCacheSize() {
+ return processedPacketCache.size();
}
}
\ No newline at end of file
--
Gitblit v1.10.0