// 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);
|
}
|
}
|
}
|