From 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf Mon Sep 17 00:00:00 2001
From: zsh_root <979909237@qq.com>
Date: 星期三, 10 十二月 2025 17:03:47 +0800
Subject: [PATCH] 发布版V1.0

---
 src/jiexi/Dell55AA51Parser.java |  100 +++++++++++++++++++++++++-------------------------
 1 files changed, 50 insertions(+), 50 deletions(-)

diff --git a/src/jiexi/Dell55AA51Parser.java b/src/jiexi/Dell55AA51Parser.java
index cdb4832..5142a8a 100644
--- a/src/jiexi/Dell55AA51Parser.java
+++ b/src/jiexi/Dell55AA51Parser.java
@@ -3,27 +3,27 @@
 import java.util.Arrays;
 
 public class Dell55AA51Parser {
-    // 预期包头
+    // 棰勬湡鍖呭ご
     private static final String EXPECTED_HEADER = "55AA51";
     private static final ThreadLocal<ParseResult> RESULT_CACHE = 
             ThreadLocal.withInitial(ParseResult::new);
 
-    // 解析结果类
+    // 瑙f瀽缁撴灉绫�
     public static class ParseResult {
-        public int dataLength;          // 数据长度(十进制)
-        public String baseStationId;    // 基站ID(2字节,低位在前)
-        public String tagId;            // 标签ID(2字节,低位在前)
-        public int packetSequence;      // 包序(十进制)
-        public int distance;            // 测距距离(十进制)
-        public int horizontalAngle;     // 水平角度(十进制)
-        public int verticalAngle;       // 俯仰角度(十进制,有符号)
-        public int signalStrength;      // 信号强度(十进制)
-        public int angleConfidence;     // 角度置信度(十进制)
-        public int tagBattery;          // 标签电量(十进制)
-        public int deviceStatus;        // 设备状态
-        public int airPressure;         // 气压值(十进制)
-        public String reserved;         // 保留字段
-        public String checksum;         // 校验和
+        public int dataLength;          // 鏁版嵁闀垮害(鍗佽繘鍒�)
+        public String baseStationId;    // 鍩虹珯ID(2瀛楄妭锛屼綆浣嶅湪鍓�)
+        public String tagId;            // 鏍囩ID(2瀛楄妭锛屼綆浣嶅湪鍓�)
+        public int packetSequence;      // 鍖呭簭(鍗佽繘鍒�)
+        public int distance;            // 娴嬭窛璺濈(鍗佽繘鍒�)
+        public int horizontalAngle;     // 姘村钩瑙掑害(鍗佽繘鍒�)
+        public int verticalAngle;       // 淇话瑙掑害(鍗佽繘鍒讹紝鏈夌鍙�)
+        public int signalStrength;      // 淇″彿寮哄害(鍗佽繘鍒�)
+        public int angleConfidence;     // 瑙掑害缃俊搴�(鍗佽繘鍒�)
+        public int tagBattery;          // 鏍囩鐢甸噺(鍗佽繘鍒�)
+        public int deviceStatus;        // 璁惧鐘舵��
+        public int airPressure;         // 姘斿帇鍊�(鍗佽繘鍒�)
+        public String reserved;         // 淇濈暀瀛楁
+        public String checksum;         // 鏍¢獙鍜�
         
         public void reset() {
             dataLength = 0;
@@ -64,23 +64,23 @@
     }
 
     /**
-     * 解析55AA51数据包
-     * @param message 原始十六进制字符串
-     * @return 解析结果(解析失败返回null)
+     * 瑙f瀽55AA51鏁版嵁鍖�
+     * @param message 鍘熷鍗佸叚杩涘埗瀛楃涓�
+     * @return 瑙f瀽缁撴灉(瑙f瀽澶辫触杩斿洖null)
      */
     public static ParseResult parse(String message, String ip, int port) {
         if (message == null || message.isEmpty()) {
             return null;
         }
 
-        // 清理消息:移除非十六进制字符
+        // 娓呯悊娑堟伅锛氱Щ闄ら潪鍗佸叚杩涘埗瀛楃
         char[] cleanedMessage = cleanMessage(message);
 
         if (cleanedMessage == null) {
             return null;
         }
 
-        // 检查包头 (55AA51)
+        // 妫�鏌ュ寘澶� (55AA51)
         if (cleanedMessage.length < 6 || 
             !new String(cleanedMessage, 0, 6).equals(EXPECTED_HEADER)) {
             return null;
@@ -90,14 +90,14 @@
         result.reset();
 
         try {
-            // 解析数据长度 (位置6-7),转换为十进制
+            // 瑙f瀽鏁版嵁闀垮害 (浣嶇疆6-7)锛岃浆鎹负鍗佽繘鍒�
             result.dataLength = HexUtils.fastHexToByte(cleanedMessage[6], cleanedMessage[7]);
             
-            // 计算期望的消息长度
-            int expectedCharLength = 6 + // 包头(3字节)
-                                    2 + // 数据长度(1字节)
-                                    result.dataLength * 2 + // 数据内容
-                                    4; // 校验和(2字节)
+            // 璁$畻鏈熸湜鐨勬秷鎭暱搴�
+            int expectedCharLength = 6 + // 鍖呭ご(3瀛楄妭)
+                                    2 + // 鏁版嵁闀垮害(1瀛楄妭)
+                                    result.dataLength * 2 + // 鏁版嵁鍐呭
+                                    4; // 鏍¢獙鍜�(2瀛楄妭)
 
             if (cleanedMessage.length != expectedCharLength) {
                 System.err.println("Data length mismatch: expected " + expectedCharLength + 
@@ -105,64 +105,64 @@
                 return null;
             }
 
-            // 解析基站ID (位置8-11,2字节,低位在前)
+            // 瑙f瀽鍩虹珯ID (浣嶇疆8-11锛�2瀛楄妭锛屼綆浣嶅湪鍓�)
             int baseIdLow = HexUtils.fastHexToByte(cleanedMessage[8], cleanedMessage[9]);
             int baseIdHigh = HexUtils.fastHexToByte(cleanedMessage[10], cleanedMessage[11]);
             int baseIdValue = (baseIdHigh << 8) | baseIdLow;
-            result.baseStationId = String.valueOf(baseIdValue); // 转换为十进制字符串
+            result.baseStationId = String.valueOf(baseIdValue); // 杞崲涓哄崄杩涘埗瀛楃涓�
 
-            // 解析标签ID (位置12-15,2字节,低位在前)
+            // 瑙f瀽鏍囩ID (浣嶇疆12-15锛�2瀛楄妭锛屼綆浣嶅湪鍓�)
             int tagIdLow = HexUtils.fastHexToByte(cleanedMessage[12], cleanedMessage[13]);
             int tagIdHigh = HexUtils.fastHexToByte(cleanedMessage[14], cleanedMessage[15]);
             int tagIdValue = (tagIdHigh << 8) | tagIdLow;
-            result.tagId = String.valueOf(tagIdValue); // 转换为十进制字符串
+            result.tagId = String.valueOf(tagIdValue); // 杞崲涓哄崄杩涘埗瀛楃涓�
 
-            // 解析包序 (位置16-17),转换为十进制
+            // 瑙f瀽鍖呭簭 (浣嶇疆16-17)锛岃浆鎹负鍗佽繘鍒�
             result.packetSequence = HexUtils.fastHexToByte(cleanedMessage[16], cleanedMessage[17]);
 
-            // 解析测距距离 (位置18-21,2字节,低位在前),转换为十进制
+            // 瑙f瀽娴嬭窛璺濈 (浣嶇疆18-21锛�2瀛楄妭锛屼綆浣嶅湪鍓�)锛岃浆鎹负鍗佽繘鍒�
             int distLow = HexUtils.fastHexToByte(cleanedMessage[18], cleanedMessage[19]);
             int distHigh = HexUtils.fastHexToByte(cleanedMessage[20], cleanedMessage[21]);
             result.distance = (distHigh << 8) | distLow;
 
-            // 解析水平角度 (位置22-25,2字节,低位在前),转换为十进制
+            // 瑙f瀽姘村钩瑙掑害 (浣嶇疆22-25锛�2瀛楄妭锛屼綆浣嶅湪鍓�)锛岃浆鎹负鍗佽繘鍒�
             int hAngleLow = HexUtils.fastHexToByte(cleanedMessage[22], cleanedMessage[23]);
             int hAngleHigh = HexUtils.fastHexToByte(cleanedMessage[24], cleanedMessage[25]);
             result.horizontalAngle = (hAngleHigh << 8) | hAngleLow;
 
-            // 解析俯仰角度 (位置26-29,2字节,低位在前),转换为十进制
-            // 注意:这是有符号数,范围-180到180度
+            // 瑙f瀽淇话瑙掑害 (浣嶇疆26-29锛�2瀛楄妭锛屼綆浣嶅湪鍓�)锛岃浆鎹负鍗佽繘鍒�
+            // 娉ㄦ剰锛氳繖鏄湁绗﹀彿鏁帮紝鑼冨洿-180鍒�180搴�
             int vAngleLow = HexUtils.fastHexToByte(cleanedMessage[26], cleanedMessage[27]);
             int vAngleHigh = HexUtils.fastHexToByte(cleanedMessage[28], cleanedMessage[29]);
             short vAngleShort = (short) ((vAngleHigh << 8) | vAngleLow);
             result.verticalAngle = vAngleShort;
 
-            // 解析信号强度 (位置30-31),转换为十进制
+            // 瑙f瀽淇″彿寮哄害 (浣嶇疆30-31)锛岃浆鎹负鍗佽繘鍒�
             result.signalStrength = HexUtils.fastHexToByte(cleanedMessage[30], cleanedMessage[31]);
 
-            // 解析角度置信度 (位置32-33),转换为十进制
+            // 瑙f瀽瑙掑害缃俊搴� (浣嶇疆32-33)锛岃浆鎹负鍗佽繘鍒�
             result.angleConfidence = HexUtils.fastHexToByte(cleanedMessage[32], cleanedMessage[33]);
 
-            // 解析标签电量 (位置34-35),转换为十进制
+            // 瑙f瀽鏍囩鐢甸噺 (浣嶇疆34-35)锛岃浆鎹负鍗佽繘鍒�
             result.tagBattery = HexUtils.fastHexToByte(cleanedMessage[34], cleanedMessage[35]);
 
-            // 解析设备状态 (位置36-39,2字节,低位在前)
+            // 瑙f瀽璁惧鐘舵�� (浣嶇疆36-39锛�2瀛楄妭锛屼綆浣嶅湪鍓�)
             int statusLow = HexUtils.fastHexToByte(cleanedMessage[36], cleanedMessage[37]);
             int statusHigh = HexUtils.fastHexToByte(cleanedMessage[38], cleanedMessage[39]);
             result.deviceStatus = (statusHigh << 8) | statusLow;
 
-            // 解析气压值 (位置40-43,2字节,低位在前),转换为十进制
+            // 瑙f瀽姘斿帇鍊� (浣嶇疆40-43锛�2瀛楄妭锛屼綆浣嶅湪鍓�)锛岃浆鎹负鍗佽繘鍒�
             int pressureLow = HexUtils.fastHexToByte(cleanedMessage[40], cleanedMessage[41]);
             int pressureHigh = HexUtils.fastHexToByte(cleanedMessage[42], cleanedMessage[43]);
             result.airPressure = (pressureHigh << 8) | pressureLow;
 
-            // 解析保留字段 (位置44-51,4字节)
+            // 瑙f瀽淇濈暀瀛楁 (浣嶇疆44-51锛�4瀛楄妭)
             result.reserved = new String(cleanedMessage, 44, 8);
 
-            // 解析校验和 (最后4个字符)
+            // 瑙f瀽鏍¢獙鍜� (鏈�鍚�4涓瓧绗�)
             result.checksum = new String(cleanedMessage, cleanedMessage.length - 4, 4);
 
-            // 验证校验和
+            // 楠岃瘉鏍¢獙鍜�
             byte[] packetBytes = hexStringToByteArray(new String(cleanedMessage));
             if (!verifyChecksum(packetBytes)) {
                 System.err.println("Checksum verification failed for packet from " + ip + ":" + port);
@@ -179,7 +179,7 @@
     }
 
     /**
-     * 将十六进制字符串转换为字节数组
+     * 灏嗗崄鍏繘鍒跺瓧绗︿覆杞崲涓哄瓧鑺傛暟缁�
      */
     private static byte[] hexStringToByteArray(String s) {
         int len = s.length();
@@ -192,21 +192,21 @@
     }
 
     /**
-     * 验证数据包校验和
-     * 从数据类型字段开始到保留字段结束,校验和为双字节补码
+     * 楠岃瘉鏁版嵁鍖呮牎楠屽拰
+     * 浠庢暟鎹被鍨嬪瓧娈靛紑濮嬪埌淇濈暀瀛楁缁撴潫锛屾牎楠屽拰涓哄弻瀛楄妭琛ョ爜
      */
     private static boolean verifyChecksum(byte[] packet) {
         int len = packet.length;
         if (len < 4) return false;
 
         int sum = 0;
-        // 从数据类型字段开始到保留字段结束 (跳过包头2字节)
+        // 浠庢暟鎹被鍨嬪瓧娈靛紑濮嬪埌淇濈暀瀛楁缁撴潫 (璺宠繃鍖呭ご2瀛楄妭)
         for (int i = 3; i < len - 2; i++) {
             sum += packet[i] & 0xFF;
         }
-        sum = ~sum & 0xFFFF; // 取反并保留16位
+        sum = ~sum & 0xFFFF; // 鍙栧弽骞朵繚鐣�16浣�
 
-        // 获取接收到的校验和 (低位在前)
+        // 鑾峰彇鎺ユ敹鍒扮殑鏍¢獙鍜� (浣庝綅鍦ㄥ墠)
         int receivedChecksum = ((packet[len - 2] & 0xFF) << 8) | (packet[len - 1] & 0xFF);
 
         return sum == receivedChecksum;

--
Gitblit v1.10.0