Python-da telemetriya paketi necə oxunur

python · telemetry · simulation

Bu yazı real uçuş proqramı deyil. Laboratoriyada simulyasiya etdiyim kiçik bir telemetriya paketini Python-da necə oxuduğumu qeyd edirəm: nə etdim, nəyi sınadım, harada ilişdim.

Nəyi simulyasiya etdim?

Sadə bir frame:

  • 2 bayt sync (0x1A, 0xCF)
  • 1 bayt APID
  • 2 bayt length
  • payload
  • 2 bayt checksum (sadə XOR)

Şəkil və ya sxem buraya belə düşür — faylı public/blog/ qovluğuna qoyub belə çağırırsan:

Sadə telemetriya frame sxemi
Sadə telemetriya frame sxemi

Hex dump

Simulyatordan çıxan ilk paket belə idi:

1A CF 05 00 08 48 65 6C 6C 6F 21 00 2A

Yəni payload Hello! + bir padding baytı.

Parser

import struct

SYNC = b"\x1a\xcf"


def parse_frame(buf: bytes) -> dict:
    if buf[:2] != SYNC:
        raise ValueError(f"bad sync: {buf[:2].hex()}")

    apid, length = struct.unpack_from(">BH", buf, 2)
    payload = buf[5 : 5 + length]
    checksum = struct.unpack_from(">H", buf, 5 + length)[0]
    calc = 0
    for b in buf[2 : 5 + length]:
        calc ^= b

    return {
        "apid": apid,
        "length": length,
        "payload": payload,
        "checksum_ok": checksum == calc,
    }


raw = bytes.fromhex("1A CF 05 00 08 48 65 6C 6C 6F 21 00 2A")
print(parse_frame(raw))

Çıxış:

{'apid': 5, 'length': 8, 'payload': b'Hello!\x00', 'checksum_ok': False}

Checksum-u ilk dəfə səhv hesabladım — XOR-a sync baytlarını da salmışdım. Yuxarıdakı versiyada sync çıxarılıb.

Nə öyrəndim

  1. Frame-i kağızda çəkmədən parser yazmaq vaxt itkisidir.
  2. struct.unpack_from offset-lə işləyəndə length sahəsini iki dəfə yoxla.
  3. Simulyasiya paketi kiçik olsa belə, real TM-də eyni vərdişlər lazımdır: sync, length, checksum.

Növbəti qeyd: eyni paketi TUN interfeysi üzərindən göndərmək.