826220679@qq.com
8 天以前 6d5ff381cafca9b82e11407dc67bf6b74f1397ee
20250811
已删除1个文件
已添加2个文件
已修改8个文件
已重命名2个文件
783 ■■■■■ 文件已修改
src/chushihua/Chushihua.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell55AAData/Dell55AA01Parser.java 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell55AAData/Dell55AA12HighPerf.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell_system/MessageViewPanel.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell_targets/Dell_BaseStation.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/publicsWay/EfficientTimeFormatter.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/publicsWay/PacketParser.java 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/publicsWay/PacketProcessingSystem.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/publicsWay/UDPPortAReceiver.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/udptcp/PacketParser.java 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/udptcp/UDPPortBReceiver.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/window/WelcomeFrame.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
systemfile/logfile/openlog.txt 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/chushihua/Chushihua.java
@@ -8,7 +8,7 @@
import dell_targets.Dell_BaseStation;
import dell_targets.Dell_SystemConfiguration;
import dell_targets.Dell_tag;
import udptcp.UDPPortAReceiver;
import publicsWay.UDPPortAReceiver;
public class Chushihua {
    public static void getchushihua()  {
src/dell55AAData/Dell55AA01Parser.java
@@ -1,104 +1,140 @@
package dell55AAData;
import java.util.Arrays;
import dell_system.MessageViewPanel;
import dell_targets.Dell_BaseStation;
import dell_targets.Dell_tag;
import publicsWay.EfficientTimeFormatter;
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 =
        ThreadLocal.withInitial(ParseResult::new);
    // å¸¸é‡å®šä¹‰
    private static final String EXPECTED_HEADER = "55AA01"; // åè®®å¤´
    private static final int MIN_LENGTH = 42; // æœ€å°é•¿åº¦(21字节*2字符)
    private static final ThreadLocal<ParseResult> RESULT_CACHE =
            ThreadLocal.withInitial(ParseResult::new);
    // è§£æžç»“果类
    public static class ParseResult {
        public int sequenceNum;   // åºåˆ—号
        public String tagId;      // æ ‡ç­¾ID(4字节小端序)
        public String anchorId;   // é”šç‚¹ID(4字节小端序)
        public int distance;      // è·ç¦»(毫米)
        public int power;         // ç”µé‡(0-100)
        public boolean buttonPressed; // æŒ‰é’®çŠ¶æ€
        public void reset() {
            sequenceNum = 0;
            tagId = "";
            anchorId = "";
            distance = 0;
            power = 0;
            buttonPressed = false;
        }
    }
    // è§£æžç»“果类
    public static class ParseResult {
        public int sequenceNum;   // åºåˆ—号
        public String tagId;      // æ ‡ç­¾ID(4字节小端序)
        public String anchorId;   // é”šç‚¹ID(4字节小端序)
        public int distance;      // è·ç¦»(毫米)
        public int power;         // ç”µé‡(0-100)
        public int buttonPressed; // æŒ‰é’®çŠ¶æ€
    /**
     * è§£æž55AA01协议数据
     * @param message åå…­è¿›åˆ¶å­—符串
     * @return è§£æžç»“æžœ(错误时返回null)
     */
    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)
        for (int i = 0; i < 6; i++) {
            if (message.charAt(i) != EXPECTED_HEADER.charAt(i)) {
                return null;
            }
        }
        ParseResult result = RESULT_CACHE.get();
        result.reset();
        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;
    }
        public void reset() {
            sequenceNum = 0;
            tagId = "";
            anchorId = "";
            distance = 0;
            power = 0;
            buttonPressed = 0;
        }
    }
    /**
     * è§£æž55AA01协议数据
     * @param message åå…­è¿›åˆ¶å­—符串
     * @return è§£æžç»“æžœ(错误时返回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 || cleanedMessage.length < MIN_LENGTH) {
            return null;
        }
        // åè®®å¤´æ ¡éªŒ (55AA01)
        if (!new String(cleanedMessage, 0, 6).equals(EXPECTED_HEADER)) {
            return null;
        }
        ParseResult result = RESULT_CACHE.get();
        result.reset();
        try {
            if (cleanedMessage.length < 30) { // ç¡®ä¿æœ‰è¶³å¤Ÿé•¿åº¦è®¿é—®charAt(28)
                return null;
            }
            // è§£æžåºåˆ—号 (位置8-9)
            result.sequenceNum = HexUtils.fastHexToByte(cleanedMessage[8], cleanedMessage[9]);
            // è§£æžæ ‡ç­¾ID (位置10-13, å°ç«¯åº)
            result.tagId = new String(new char[]{
                    cleanedMessage[12], cleanedMessage[13], // é«˜ä½
                    cleanedMessage[10], cleanedMessage[11]  // ä½Žä½
            });
            // è§£æžé”šç‚¹ID (位置14-17, å°ç«¯åº)
            result.anchorId = new String(new char[]{
                    cleanedMessage[16], cleanedMessage[17], // é«˜ä½
                    cleanedMessage[14], cleanedMessage[15]  // ä½Žä½
            });
            // è§£æžè·ç¦» (位置18-25, 4字节小端整数)
            int b0 = HexUtils.fastHexToByte(cleanedMessage[18], cleanedMessage[19]); // æœ€ä½Žä½
            int b1 = HexUtils.fastHexToByte(cleanedMessage[20], cleanedMessage[21]);
            int b2 = HexUtils.fastHexToByte(cleanedMessage[22], cleanedMessage[23]);
            int b3 = HexUtils.fastHexToByte(cleanedMessage[24], cleanedMessage[25]); // æœ€é«˜ä½
            int raw = (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
            result.distance = raw; // ä¿æŒåŽŸå§‹æ•´æ•°å€¼
            // è§£æžç”µé‡ (位置26-27)
            result.power = HexUtils.fastHexToByte(cleanedMessage[26], cleanedMessage[27]);
            // è§£æžæŒ‰é’®çŠ¶æ€ (位置28-29)
            result.buttonPressed = HexUtils.fastHexToByte(cleanedMessage[28], cleanedMessage[29]);
            // æ—¥å¿—和更新操作可以考虑优化或减少调用频率
            String hexData = "55AA01 åŒ…序:" + result.sequenceNum + ",标签编号:" + result.tagId + ",基站编号:" + result.anchorId +
                    ",距离:" + result.distance + ",电量:" + result.power +
                    ",按钮状态:" + result.buttonPressed;
            MessageViewPanel.showData(hexData, ip, port, 0, "UDPA", "55AA01", "ALL");
            String time = EfficientTimeFormatter.getCurrentTimeFormatted();
            Dell_BaseStation.updateBaseStationProperty(result.anchorId, "ipAddress", ip);
            Dell_BaseStation.updateBaseStationProperty(result.anchorId, "port", port + "");
            Dell_BaseStation.updateBaseStationProperty(result.anchorId, "status", "1");
            Dell_BaseStation.updateBaseStationProperty(result.anchorId, "onlineTime", time);
            Dell_tag.updateLocationTagProperty(result.tagId, "sosStatus", result.buttonPressed + "");
            Dell_tag.updateLocationTagProperty(result.tagId, "onlineStatus", "1");
            Dell_tag.updateLocationTagProperty(result.tagId, "lastUwbSignalTime", time);
            Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingSeq", result.sequenceNum + "");
            Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingBaseId", result.anchorId);
            Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingDistance", result.distance + "");
            Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingBaseCount", "1");
        } catch (IndexOutOfBoundsException | NumberFormatException e) {
            System.err.println("Parsing error in packet from " + ip + ":" + port);
            return null;
        }
        return result;
    }
    private static char[] cleanMessage(String message) {
        char[] cleaned = new char[message.length()];
        int j = 0;
        for (char c : message.toCharArray()) {
            if (Character.isDigit(c) || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) {
                cleaned[j++] = Character.toUpperCase(c);
            }
        }
        if (j == 0) return null;
        return Arrays.copyOf(cleaned, j);
    }
    public static void updateBase(String baseStationId, String propertyName, String value) {
        Dell_BaseStation.updateBaseStationProperty(baseStationId, propertyName, value);
        Dell_BaseStation.updateBaseStationProperty(baseStationId, propertyName, value);
    }
}
src/dell55AAData/Dell55AA12HighPerf.java
@@ -48,7 +48,7 @@
     * @param message åŽŸå§‹16进制字符串
     * @return è§£æžç»“果对象(线程安全)
     */
    public static ParseResult parse(String message) {
    public static ParseResult parse(String message,String ip,int port) {
        // é•¿åº¦æ ¡éªŒ
        if (message == null || message.length() < MIN_LENGTH) {
            return null;
src/dell_system/MessageViewPanel.java
@@ -12,7 +12,7 @@
import java.util.ResourceBundle;
import dell_targets.Dell_tag;
import publicsWay.Languages;
import udptcp.UDPPortAReceiver;
import publicsWay.UDPPortAReceiver;
import udptcp.UDPPortBReceiver;
public class MessageViewPanel extends JPanel {
src/dell_targets/Dell_BaseStation.java
@@ -113,6 +113,8 @@
            station.setBattery(value); break; // æ›´æ–°ç”µé‡
        case "ipAddress":
            station.setIpAddress(value); break; // æ›´æ–°IP地址
        case "port":
            station.setPort(value); break; //更新端口
        case "onlineTime":
            station.setOnlineTime(value); break; // æ›´æ–°ä¸Šçº¿æ—¶é—´
        case "offlineTime":
@@ -123,7 +125,7 @@
            station.setSyncStatus(value); break; //同步状态
        case "barometerReading":
            station.setBarometerReading(value); break; //同步状态
            // æ·»åŠ å…¶ä»–é«˜é¢‘å±žæ€§...
        default:
            throw new IllegalArgumentException("不支持属性: " + propertyName);
src/publicsWay/EfficientTimeFormatter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package publicsWay;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
public class EfficientTimeFormatter {
    // ä½¿ç”¨ ThreadLocal æ¥å­˜å‚¨æ¯ä¸ªçº¿ç¨‹çš„ DateTimeFormatter
    private static final ThreadLocal<DateTimeFormatter> formatterThreadLocal = ThreadLocal.withInitial(() -> {
        // ä½¿ç”¨ DateTimeFormatterBuilder æž„建一个高效的格式化器
        return new DateTimeFormatterBuilder()
                .appendValue(ChronoField.YEAR, 4)
                .appendLiteral('-')
                .appendValue(ChronoField.MONTH_OF_YEAR, 2)
                .appendLiteral('-')
                .appendValue(ChronoField.DAY_OF_MONTH, 2)
                .appendLiteral(' ')
                .appendValue(ChronoField.HOUR_OF_DAY, 2)
                .appendLiteral(':')
                .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
                .appendLiteral(':')
                .appendValue(ChronoField.SECOND_OF_MINUTE, 2)
                .toFormatter();
    });
    // èŽ·å–å½“å‰æ—¶é—´çš„å­—ç¬¦ä¸²è¡¨ç¤º
    public static String getCurrentTimeFormatted() {
        Instant now = Instant.now(); // èŽ·å–å½“å‰æ—¶é—´
        DateTimeFormatter formatter = formatterThreadLocal.get(); // èŽ·å–å½“å‰çº¿ç¨‹çš„æ ¼å¼åŒ–å™¨
        return formatter.format(now.atZone(ZoneId.systemDefault())); // æ ¼å¼åŒ–æ—¶é—´
    }
}
src/publicsWay/PacketParser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,222 @@
package publicsWay;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
// é‡å‘½åä¸ºPacketParser,表示数据包解析器
public class PacketParser {
    // æ·»åŠ åå…­è¿›åˆ¶å­—ç¬¦æ•°ç»„å¸¸é‡
    private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
    // ç¼“冲区字节数组
    private byte[] buffer = new byte[4096];
    // å½“前缓冲区有效数据长度
    private int bufferLength = 0;
    // è¿½åŠ æ–°æ•°æ®åˆ°ç¼“å†²åŒº
    public void appendData(byte[] newData, int length) {
        // æ£€æŸ¥ç¼“冲区是否足够
        if (bufferLength + length > buffer.length) {
            // åˆ›å»ºæ–°çš„æ›´å¤§ç¼“冲区
            byte[] newBuffer = new byte[bufferLength + length];
            // å¤åˆ¶åŽŸæœ‰æ•°æ®
            System.arraycopy(buffer, 0, newBuffer, 0, bufferLength);
            buffer = newBuffer;
        }
        // è¿½åŠ æ–°æ•°æ®
        System.arraycopy(newData, 0, buffer, bufferLength, length);
        // æ›´æ–°ç¼“冲区长度
        bufferLength += length;
    }
    // æ–°å¢žæ–¹æ³•:字节数组转十六进制字符串
    public static String bytesToHexString(byte[] bytes) {
        if (bytes == null) return "";
        char[] hexChars = new char[bytes.length * 2];
        for (int j = 0; j < bytes.length; j++) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = HEX_ARRAY[v >>> 4];
            hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
        }
        return new String(hexChars);
    }
    // è§£æžç¼“冲区中的所有完整数据包
    public List<DataPacket> parsePackets() {
        List<DataPacket> packets = new ArrayList<>();
        int index = 0;  // å½“前解析位置索引
        // éåŽ†ç¼“å†²åŒºæŸ¥æ‰¾å®Œæ•´æ•°æ®åŒ…
        while (index <= bufferLength - 4) { // ç¡®ä¿æœ‰è¶³å¤Ÿæ•°æ®æ£€æŸ¥åŒ…头
            // æ£€æŸ¥åŒ…头标识 0x55 0xAA
            if (buffer[index] == 0x55 && (buffer[index + 1] & 0xFF) == 0xAA) {
                // èŽ·å–åŒ…ç±»åž‹ï¼ˆç¬¬3字节)
                int packetType = buffer[index + 2] & 0xFF;
                // èŽ·å–æ•°æ®é•¿åº¦ï¼ˆç¬¬4字节)
                int dataLenField = buffer[index + 3] & 0xFF;
                // è®¡ç®—完整包长度(包头+数据+校验)
                int totalPacketLen = 2 + dataLenField + 2;  // å¢žåŠ 2字节校验位
                // æ£€æŸ¥æ˜¯å¦æœ‰è¶³å¤Ÿæ•°æ®æž„成完整包
                if (index + totalPacketLen > bufferLength) {
                    break; // æ•°æ®ä¸è¶³ï¼Œç­‰å¾…更多数据
                }
                // æå–完整数据包
                byte[] packetData = new byte[totalPacketLen];
                System.arraycopy(buffer, index, packetData, 0, totalPacketLen);
                // éªŒè¯æ ¡éªŒå’Œ
                if (verifyChecksum(packetData)) {
                    // è§£æžå•个数据包
                    DataPacket packet = parseSinglePacket(packetType, packetData);
                    if (packet != null) {
                        packets.add(packet); // æ·»åŠ åˆ°ç»“æžœåˆ—è¡¨
                    }
                    index += totalPacketLen; // ç§»åŠ¨åˆ°ä¸‹ä¸€ä¸ªåŒ…
                } else {
                    index++; // æ ¡éªŒå¤±è´¥ï¼Œè·³è¿‡å½“前字节
                }
            } else {
                index++; // éžåŒ…头标识,继续查找
            }
        }
        // æ¸…理已处理数据
        if (index > 0) {
            int remaining = bufferLength - index;
            if (remaining > 0) {
                // ç§»åŠ¨å‰©ä½™æ•°æ®åˆ°ç¼“å†²åŒºå¼€å¤´
                System.arraycopy(buffer, index, buffer, 0, remaining);
            }
            bufferLength = remaining; // æ›´æ–°ç¼“冲区长度
        }
        return packets;
    }
    // æ ¡éªŒæ•°æ®åŒ…
    private boolean verifyChecksum(byte[] packet) {
        int len = packet.length;
        if (len < 4) return false;
        int sum = 0;
        // ä»Žæ•°æ®ç±»åž‹å¼€å§‹åˆ°æ ¡éªŒç å‰ç»“束 (包头2字节已跳过)
        for (int i = 2; i < len - 2; i++) {
            sum += packet[i] & 0xFF;
        }
        sum = ~sum & 0xFFFF; // å–反并保留16位
        // èŽ·å–åŒ…ä¸­çš„æ ¡éªŒç  (小端模式)
        int receivedChecksum = ((packet[len - 1] & 0xFF) << 8) | (packet[len - 2] & 0xFF);
        return sum == receivedChecksum;
    }
    // è§£æžå•个数据包
    private DataPacket parseSinglePacket(int packetType, byte[] packet) {
        // åˆ›å»ºæ•°æ®åŒ…对象(包含包类型)
        return new DataPacket(packetType, packet);
    }
    // æ•°æ®åŒ…内部类
    public static class DataPacket {
        private final int packetType;  // åŒ…类型
        private final byte[] packet;//包数据
        public DataPacket(int packetType, byte[] packet) {
            this.packetType = packetType;
            this.packet = packet;
        }
        // èŽ·å–åŒ…ç±»åž‹
        public int getPacketType() {
            return packetType;
        }
        // åŒ…数据
        public byte[] getPacket() {
            return packet;
        }
    }
    // HEX字符串转字节数组
    public static byte[] hexStringToBytes(String hex) {
        // ç§»é™¤ç©ºæ ¼
        hex = hex.replaceAll("\\s", "");
        int len = hex.length();
        // åˆ›å»ºç»“果数组
        byte[] data = new byte[len / 2];
        // æ¯ä¸¤ä¸ªå­—符转换一个字节
        for (int i = 0; i < len; i += 2) {
            // é«˜ä½è½¬æ¢
            int high = Character.digit(hex.charAt(i), 16) << 4;
            // ä½Žä½è½¬æ¢
            int low = Character.digit(hex.charAt(i + 1), 16);
            data[i / 2] = (byte) (high | low);
        }
        return data;
    }
    /**输出校验码*/
    public static String calculateChecksum(String input) {
        // æ£€æŸ¥è¾“入是否为空
        if (input == null) {
            throw new IllegalArgumentException("输入不能为null");
        }
        // ç§»é™¤æ‰€æœ‰ç©ºæ ¼
        String cleanInput = input.replaceAll("\\s", "");
        // éªŒè¯å¤„理后的字符串
        if (cleanInput.length() < 8 || !cleanInput.startsWith("55AA")) {
            throw new IllegalArgumentException("输入字符串必须以55AA开头且长度至少为8(去除空格后)");
        }
        // åŽ»æŽ‰åŒ…å¤´(55AA)和最后4个字符
        String dataPart = cleanInput.substring(4, cleanInput.length() - 4);
        // æ£€æŸ¥ä¸­é—´éƒ¨åˆ†é•¿åº¦æ˜¯å¦ä¸ºå¶æ•°
        if (dataPart.length() % 2 != 0) {
            throw new IllegalArgumentException("中间部分长度必须是偶数(去除空格后)");
        }
        int sum = 0;
        // æ¯ä¸¤ä¸ªå­—符解析为一个字节
        for (int i = 0; i < dataPart.length(); i += 2) {
            String byteStr = dataPart.substring(i, i + 2);
            int byteValue = Integer.parseInt(byteStr, 16);
            sum = (sum + byteValue) & 0xFFFF; // ä¿æŒ16位范围
        }
        // å–反并保持16位
        int checksum = (~sum) & 0xFFFF;
        // æ˜¾å¼å¤„理高位在前格式
        int  lowByte= (checksum >>> 8) & 0xFF;  // é«˜8位
        int  highByte= checksum & 0xFF;           // ä½Ž8位
        // æ ¼å¼åŒ–为4位十六进制字符串(大写),高位在前
        System.out.println(String.format("%02X%02X", highByte, lowByte));
        return String.format("%02X%02X", highByte, lowByte);
    }
    /** å°†å­—节数组转为十六进制字符串,例如 [55 AA 01 02 ...] */
    private static String bytesToHex(byte[] bytes) {
        if (bytes == null) return "null";
        StringBuilder sb = new StringBuilder(bytes.length * 3);
        for (byte b : bytes) {
            sb.append(String.format("%02X ", b & 0xFF));
        }
        // åŽ»æŽ‰æœ€åŽä¸€ä¸ªç©ºæ ¼
        return sb.substring(0, sb.length() - 1);
    }
}
src/publicsWay/PacketProcessingSystem.java
ÎļþÃû´Ó src/udptcp/PacketProcessingSystem.java ÐÞ¸Ä
@@ -1,8 +1,10 @@
package udptcp;
package publicsWay;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import dell55AAData.Dell55AA01Parser;
import dell55AAData.Dell55AA12HighPerf;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -62,8 +64,7 @@
        
        isRunning.set(true);
        parserThread = new Thread(() -> {
            PacketParser bufferManager = new PacketParser();
            PacketParser bufferManager = new PacketParser();
            while (isRunning.get()) {
                HexPacket packet = packetQueue.poll();
                if (packet == null) {
@@ -88,7 +89,8 @@
                                processType01(p,ip,port);break;
                            case 0x02:
                                processType02(p,ip,port);break;
                            case 0x12:
                                processType12(p,ip,port);break;
                            default:
                                System.err.println("未知包类型: " + p.getPacketType());
                        }
@@ -119,9 +121,14 @@
    }
    private static void processType02(PacketParser.DataPacket packet,String ip,int port) {
        String hexData = PacketParser.bytesToHexString(packet.getPacket());
        System.out.println("处理55AA02包: " + packet);
        // å®žé™…业务逻辑
    }
    
    private static void processType12(PacketParser.DataPacket packet,String ip,int port) {
        String hexData = PacketParser.bytesToHexString(packet.getPacket());
        Dell55AA12HighPerf.parse(hexData,ip,port);
    }
    // å…¶ä»–类型处理方法...
}
src/publicsWay/UDPPortAReceiver.java
ÎļþÃû´Ó src/udptcp/UDPPortAReceiver.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package udptcp;
package publicsWay;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
@@ -104,10 +104,10 @@
    }
    private static String bytesToHex(byte[] bytes, int length) {
        if (bytes == null || length <= 0) return "";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            // ç¡®ä¿ç”Ÿæˆå¤§å†™ã€æ— åˆ†éš”符的十六进制
            sb.append(String.format("%02X", bytes[i]));
        for (int i = 0; i < length && i < bytes.length; i++) {
            sb.append(String.format("%02X", bytes[i] & 0xFF));
        }
        return sb.toString();
    }
src/udptcp/PacketParser.java
ÎļþÒÑɾ³ý
src/udptcp/UDPPortBReceiver.java
@@ -6,6 +6,8 @@
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import publicsWay.PacketProcessingSystem;
public class UDPPortBReceiver {
    public static final int PORT = 7000;
    @SuppressWarnings("unused")
src/window/WelcomeFrame.java
@@ -9,10 +9,10 @@
import java.util.ResourceBundle;
import udptcp.UDPPortAReceiver;
import udptcp.UDPPortBReceiver;
import dell_targets.Dell_BaseStation;
import dell_targets.Dell_tag;
import publicsWay.UDPPortAReceiver;
import dell_targets.Dell_SystemConfiguration;
public class WelcomeFrame extends JInternalFrame {
systemfile/logfile/openlog.txt
@@ -918,3 +918,45 @@
程序关闭: 2025-08-10 23:04:37
工作时长: 0小时 0分钟 30秒
-----------------------------------
程序启动: 2025-08-11 21:15:59
程序启动: 2025-08-11 21:17:08
程序关闭: 2025-08-11 21:17:13
工作时长: 0小时 1分钟 13秒
-----------------------------------
程序启动: 2025-08-11 21:17:15
程序启动: 2025-08-11 21:19:09
程序关闭: 2025-08-11 21:19:13
工作时长: 0小时 1分钟 57秒
-----------------------------------
程序启动: 2025-08-11 21:19:15
程序启动: 2025-08-11 21:31:02
程序关闭: 2025-08-11 21:31:05
工作时长: 0小时 11分钟 50秒
-----------------------------------
程序启动: 2025-08-11 21:31:07
程序启动: 2025-08-11 21:31:57
程序启动: 2025-08-11 21:47:14
程序启动: 2025-08-11 21:48:16
程序启动: 2025-08-11 21:56:20
程序关闭: 2025-08-11 22:00:14
工作时长: 0小时 3分钟 54秒
-----------------------------------
程序启动: 2025-08-11 22:00:17
程序启动: 2025-08-11 22:03:49
程序启动: 2025-08-11 22:14:55
程序关闭: 2025-08-11 22:14:57
工作时长: 0小时 0分钟 2秒
-----------------------------------
程序启动: 2025-08-11 22:15:01
程序启动: 2025-08-11 22:16:04
程序启动: 2025-08-11 22:18:00
程序启动: 2025-08-11 22:21:23
程序启动: 2025-08-11 22:25:32
程序关闭: 2025-08-11 22:25:37
工作时长: 0小时 0分钟 5秒
-----------------------------------
程序启动: 2025-08-11 22:27:02
程序关闭: 2025-08-11 22:27:28
工作时长: 0小时 0分钟 25秒
-----------------------------------
程序启动: 2025-08-11 23:04:55