import struct # --------------------------------------------------------------------------- # UBX Protokoll-Konstanten # --------------------------------------------------------------------------- UBX_SYNC1 = 0xB5 UBX_SYNC2 = 0x62 UBX_CLASS_NAV = 0x01 UBX_ID_NAV_SAT = 0x35 UBX_ID_NAV_SVINFO = 0x30 UBX_SYNC_WORD = b'\xb5\x62' def checksum(data: bytes) -> bytes: ck_a = 0 ck_b = 0 for i in range(len(data)): ck_a = (ck_a + data[i]) & 0xFF ck_b = (ck_b + ck_a) & 0xFF return struct.pack("BB", ck_a, ck_b) class Hdr: def __init__(self, _class: int, _id: int, _length: int): self.mclass = _class self.mid = _id self.length = _length def frame_parse_hdr(frame: bytes) -> Hdr|None: hdr = Hdr(0,0,0) if len(frame) < 4: return None hdr.mclass = struct.unpack('B', frame[0:1])[0] hdr.mid = struct.unpack('B', frame[1:2])[0] hdr.length = struct.unpack(' 0: self.packet += self.d_save self.d_save = b'' self.sync_count = 0 if not self.wait_sync: self.packet += struct.pack('B', d) data, hdr = frame_parse(self.packet) if data is not None: if hdr.length == len(data): frames.append({"cls": hdr.mclass, "id": hdr.mid, "payload": data}) self.packet = b'' self.wait_sync = True return frames # --------------------------------------------------------------------------- # UBX Hilfsfunktionen # --------------------------------------------------------------------------- def ubx_checksum(payload: bytes) -> tuple[int, int]: ck_a = ck_b = 0 for b in payload: ck_a = (ck_a + b) & 0xFF ck_b = (ck_b + ck_a) & 0xFF return ck_a, ck_b def build_ubx(cls: int, msg_id: int, payload: bytes = b"") -> bytes: header = bytes([UBX_SYNC1, UBX_SYNC2, cls, msg_id]) length = struct.pack(" bytes: return build_ubx(cls, msg_id, b"") def parse_nav_sat(payload: bytes) -> list[dict]: if len(payload) < 8: return [] num_svs = payload[5] sats = [] for n in range(num_svs): off = 8 + n * 12 if off + 12 > len(payload): break gnss_id, sv_id, cno, elev, azim, _, flags = struct.unpack_from( " list[dict]: if len(payload) < 8: return [] num_ch = payload[4] sats = [] for n in range(num_ch): off = 8 + n * 12 if off + 12 > len(payload): break _, svid, flags, _, cno, elev, azim, _ = struct.unpack_from( " list[dict]: for f in frames: if f["cls"] == UBX_CLASS_NAV and f["id"] == UBX_ID_NAV_SAT: return parse_nav_sat(f["payload"]) if f["cls"] == UBX_CLASS_NAV and f["id"] == UBX_ID_NAV_SVINFO: return parse_nav_svinfo(f["payload"]) return []