// 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 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 parsePackets() { List 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; } } }