From fb883547ede83b1c758b1a9a025898ba3f83497a Mon Sep 17 00:00:00 2001
From: 826220679@qq.com <826220679@qq.com>
Date: 星期日, 10 八月 2025 23:05:19 +0800
Subject: [PATCH] 新增

---
 src/dell55AAData/Dell55AA01Parser.java |   96 +++++++++++++++++++++++++++++-------------------
 1 files changed, 58 insertions(+), 38 deletions(-)

diff --git a/src/dell55AAData/Dell55AA01Parser.java b/src/dell55AAData/Dell55AA01Parser.java
index f95489e..e44c3e8 100644
--- a/src/dell55AAData/Dell55AA01Parser.java
+++ b/src/dell55AAData/Dell55AA01Parser.java
@@ -1,7 +1,9 @@
 package dell55AAData;
 
+import dell_system.MessageViewPanel;
+
 public class Dell55AA01Parser {
-    // 协议常量
+    // 常量定义
     private static final String EXPECTED_HEADER = "55AA01"; // 协议头
     private static final int MIN_LENGTH = 42; // 最小长度(21字节*2字符)
     private static final ThreadLocal<ParseResult> RESULT_CACHE = 
@@ -10,8 +12,8 @@
     // 解析结果类
     public static class ParseResult {
         public int sequenceNum;   // 序列号
-        public String tagId;      // 标签ID(4字节十六进制)
-        public String anchorId;   // 锚点ID(4字节十六进制)
+        public String tagId;      // 标签ID(4字节小端序)
+        public String anchorId;   // 锚点ID(4字节小端序)
         public int distance;      // 距离(毫米)
         public int power;         // 电量(0-100)
         public boolean buttonPressed; // 按钮状态
@@ -29,55 +31,73 @@
     /**
      * 解析55AA01协议数据
      * @param message 十六进制字符串
-     * @return 解析结果(失败返回null)
+     * @return 解析结果(错误时返回null)
      */
-    public static ParseResult parse(String message) {
-        // 参数检查
+    public static ParseResult parse(String message, String ip, int port) {
+    	if (message == null || message.isEmpty()) {
+            return null;
+        }
+        // 清洗数据:移除所有非十六进制字符
+        message = message.replaceAll("[^0-9A-Fa-f]", "").toUpperCase();
+        
+        // 数据校验
         if (message == null || message.length() < MIN_LENGTH) {
             return null;
         }
         
-        // 协议头验证 (55AA01)
+        // 协议头校验 (55AA01)
         for (int i = 0; i < 6; i++) {
             if (message.charAt(i) != EXPECTED_HEADER.charAt(i)) {
                 return null;
             }
         }
         
-        // 获取线程本地资源
         ParseResult result = RESULT_CACHE.get();
         result.reset();
-        char[] chars = HexUtils.getThreadLocalBuffer();
-        message.getChars(0, Math.min(message.length(), chars.length), chars, 0);
         
-        // 解析序列号 (位置8-9)
-        result.sequenceNum = HexUtils.fastHexToByte(chars[8], chars[9]);
-        
-        // 解析标签ID (位置10-13, 小端序)
-        result.tagId = new String(new char[] {
-            chars[12], chars[13], // 高位
-            chars[10], chars[11]   // 低位
-        });
-        
-        // 解析锚点ID (位置14-17, 小端序)
-        result.anchorId = new String(new char[] {
-            chars[16], chars[17], // 高位
-            chars[14], chars[15]   // 低位
-        });
-        
-        // 解析距离 (位置18-25, 4字节小端序整数)
-        int b0 = HexUtils.fastHexToByte(chars[18], chars[19]); // 最低位
-        int b1 = HexUtils.fastHexToByte(chars[20], chars[21]);
-        int b2 = HexUtils.fastHexToByte(chars[22], chars[23]);
-        int b3 = HexUtils.fastHexToByte(chars[24], chars[25]); // 最高位
-        int raw = (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
-        result.distance = raw; // 保持原始整数值
-        
-        // 解析电量 (位置26-27)
-        result.power = HexUtils.fastHexToByte(chars[26], chars[27]);
-        
-        // 解析按钮状态 (位置28-29)
-        result.buttonPressed = HexUtils.fastHexToByte(chars[28], chars[29]) == 1;
+        try {
+        	if (message.length() < 30) { // 确保有足够长度访问charAt(28)
+                return null;
+            }
+            // 解析序列号 (位置8-9)
+            result.sequenceNum = HexUtils.fastHexToByte(
+                message.charAt(8), message.charAt(9)
+            );
+            
+            // 解析标签ID (位置10-13, 小端序)
+            result.tagId = new String(new char[] {
+                message.charAt(12), message.charAt(13), // 高位
+                message.charAt(10), message.charAt(11)   // 低位
+            });
+            
+            // 解析锚点ID (位置14-17, 小端序)
+            result.anchorId = new String(new char[] {
+                message.charAt(16), message.charAt(17), // 高位
+                message.charAt(14), message.charAt(15)   // 低位
+            });
+            
+            // 解析距离 (位置18-25, 4字节小端整数)
+            int b0 = HexUtils.fastHexToByte(message.charAt(18), message.charAt(19)); // 最低位
+            int b1 = HexUtils.fastHexToByte(message.charAt(20), message.charAt(21));
+            int b2 = HexUtils.fastHexToByte(message.charAt(22), message.charAt(23));
+            int b3 = HexUtils.fastHexToByte(message.charAt(24), message.charAt(25)); // 最高位
+            int raw = (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
+            result.distance = raw; // 保持原始整数值
+            
+            // 解析电量 (位置26-27)
+            result.power = HexUtils.fastHexToByte(message.charAt(26), message.charAt(27));
+            
+            // 解析按钮状态 (位置28-29)
+            result.buttonPressed = HexUtils.fastHexToByte(message.charAt(28), message.charAt(29)) == 1;
+            
+            String hexData = "55AA01标签地址:" + result.tagId + "基站地址:" + result.anchorId + 
+                             "距离:" + result.distance + "电量:" + result.power + 
+                             "按钮状态:" + result.buttonPressed;
+            MessageViewPanel.showData(hexData, ip, port, 0, "UDPA", "55AA01", "ALL");
+        } catch (IndexOutOfBoundsException | NumberFormatException e) {
+        	System.err.println("Parsing error in packet from " + ip + ":" + port);
+            return null;
+        }
         
         return result;
     }

--
Gitblit v1.9.3