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:
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
- Frame-i kağızda çəkmədən parser yazmaq vaxt itkisidir.
struct.unpack_fromoffset-lə işləyəndə length sahəsini iki dəfə yoxla.- 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.