826220679@qq.com
2025-08-07 0e0e51fc63a865977d751271be28437e24dd6a99
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// UwbDataParser.java
package publicsWay;
import java.util.ArrayList;
import java.util.List;
 
public class UwbDataParser {
    private byte[] buffer = new byte[4096];
    private int bufferLength = 0;
 // Ìí¼ÓеÄparse·½·¨
    public String parse(byte[] data) {
        // Ìí¼ÓÊý¾Ýµ½»º³åÇø
        appendData(data, data.length);
        
        // ½âÎöÊý¾Ý°ü
        List<DataPacket> packets = parsePackets();
        
        if (packets.isEmpty()) {
            return "No complete packet found in data";
        }
        
        StringBuilder result = new StringBuilder();
        for (DataPacket packet : packets) {
            result.append(packet.toString()).append("\n");
        }
        return result.toString();
    }
    
    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 void clearBuffer() {
        bufferLength = 0;
    }
 
    public List<DataPacket> parsePackets() {
        List<DataPacket> packets = new ArrayList<>();
        int index = 0;
        
        while (index <= bufferLength - 4) {
            if (buffer[index] == 0x55 && (buffer[index + 1] & 0xFF) == 0xAA) {
                int dataType = buffer[index + 2] & 0xFF;
                int dataLenField = buffer[index + 3] & 0xFF;
                int totalPacketLen = 4 + dataLenField;
                
                if (index + totalPacketLen > bufferLength) {
                    break;
                }
                
                byte[] packetData = new byte[totalPacketLen];
                System.arraycopy(buffer, index, packetData, 0, totalPacketLen);
                
                if (verifyChecksum(packetData)) {
                    DataPacket packet = parseSinglePacket(packetData);
                    if (packet != null) {
                        packets.add(packet);
                    }
                    index += totalPacketLen;
                } else {
                    index++;
                }
            } else {
                index++;
            }
        }
        
        if (index > 0) {
            int remaining = bufferLength - index;
            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;
        for (int i = 2; i < len - 2; i++) {
            sum += packet[i] & 0xFF;
        }
        sum = ~sum & 0xFFFF;
        
        int receivedChecksum = ((packet[len - 1] & 0xFF) << 8) | (packet[len - 2] & 0xFF);
        
        return sum == receivedChecksum;
    }
 
    private DataPacket parseSinglePacket(byte[] packet) {
        int sequence = packet[4] & 0xFF;
        int tagId = ((packet[6] & 0xFF) << 8) | (packet[5] & 0xFF);
        int baseId = ((packet[8] & 0xFF) << 8) | (packet[7] & 0xFF);
        
        int distance = (packet[12] << 24) | 
                     ((packet[11] & 0xFF) << 16) | 
                     ((packet[10] & 0xFF) << 8) | 
                     (packet[9] & 0xFF);
        
        int battery = packet[13] & 0xFF;
        int buttonStatus = packet[14] & 0xFF;
        
        return new DataPacket(sequence, 
                            String.format("%04X", tagId),
                            String.format("%04X", baseId),
                            distance, battery, buttonStatus);
    }
 
    public static class DataPacket {
        private final int sequence;
        private final String tagId;
        private final String baseId;
        private final int distance;
        private final int battery;
        private final int buttonStatus;
 
        public DataPacket(int sequence, String tagId, String baseId, 
                          int distance, int battery, int buttonStatus) {
            this.sequence = sequence;
            this.tagId = tagId;
            this.baseId = baseId;
            this.distance = distance;
            this.battery = battery;
            this.buttonStatus = buttonStatus;
        }
 
        @Override
        public String toString() {
            return String.format("°üÐò: %d, ±êÇ©: %s, »ùÕ¾: %s, ¾àÀë: %d mm, µçÁ¿: %d%%, °´¼ü: %d",
                                sequence, tagId, baseId, distance, battery, buttonStatus);
        }
    }
}