Hai Habr. Mungkin setiap orang yang pernah bertemu atau menemani kerabat atau teman di pesawat menggunakan layanan Flightradar24 gratis. Ini adalah cara yang sangat nyaman untuk melacak posisi pesawat secara real time.

Bagian
pertama menggambarkan prinsip pengoperasian layanan online semacam itu. Sekarang kita akan melangkah lebih jauh, dan mencari tahu data apa yang dikirimkan dan diterima dari pesawat ke stasiun penerima, dan mendekodekannya sendiri menggunakan Python.
Ceritanya
Jelas, data pesawat tidak ditransmisikan sehingga pengguna dapat melihatnya di smartphone mereka. Sistem ini disebut ADS-B (Automatic-surveillance-broadcast - broadcast), dan digunakan untuk secara otomatis mengirimkan informasi pesawat ke pusat kendali - pengidentifikasi, koordinat, arah, kecepatan, ketinggian, dan data lainnya dikirimkan. Sebelumnya, sebelum munculnya sistem seperti itu, operator hanya bisa melihat titik di radar. Ini tidak cukup ketika ada terlalu banyak pesawat.
Secara teknis, ADS-B terdiri dari pemancar di pesawat terbang yang secara berkala mengirimkan paket dengan informasi pada frekuensi yang cukup tinggi 1090 MHz (ada mode lain, tetapi mereka tidak begitu menarik bagi kami, karena koordinatnya hanya dikirimkan di sini). Tentu saja, selain pemancar, ada juga penerima di suatu tempat di bandara, tetapi bagi kami, seperti bagi pengguna, penerima kami sendiri menarik.
Ngomong-ngomong, untuk perbandingan, sistem seperti itu yang pertama, Airnav Radarbox, dirancang untuk pengguna biasa, muncul pada 2007, dan harganya sekitar $ 900, sekitar $ 250 setahun layak berlangganan layanan jaringan.

Anda dapat membaca ulasan pemilik Rusia pertama di forum
radioscanner . Sekarang penerima RTL-SDR telah tersedia secara luas, perangkat serupa dapat dirakit seharga $ 30, lebih lanjut tentang ini di bagian
pertama . Kami akan melanjutkan ke protokol itu sendiri - mari kita lihat cara kerjanya.
Menerima sinyal
Untuk memulai, sinyal perlu direkam. Seluruh sinyal memiliki durasi hanya 120 mikrodetik, oleh karena itu, untuk dapat membongkar komponennya dengan nyaman, penerima SDR dengan frekuensi pengambilan sampel minimal 5 MHz diperlukan.

Setelah merekam, kami mendapatkan file WAV dengan frekuensi sampling 5.000.000 sampel / detik, 30 detik dari rekaman "menimbang" sekitar 500 MB. Mendengarkannya dengan pemutar media tentu saja tidak berguna - file tidak mengandung suara, tetapi sinyal radio yang langsung didigitalkan - ini adalah cara kerja Radio yang Ditentukan Perangkat Lunak.
Kami akan membuka dan memproses file menggunakan Python. Mereka yang ingin bereksperimen sendiri dapat mengunduh rekaman sampel
dari tautan .
Unduh file dan lihat apa yang ada di dalamnya.
from scipy.io import wavfile import matplotlib.pyplot as plt import numpy as np fs, data = wavfile.read("adsb_20190311_191728Z_1090000kHz_RF.wav") data = data.astype(float) I, Q = data[:, 0], data[:, 1] A = np.sqrt(I*I + Q*Q) plt.plot(A) plt.show()
Hasil: kita melihat "impuls" yang jelas terhadap latar belakang kebisingan.

Setiap "impuls" adalah sinyal yang strukturnya terlihat jelas jika Anda meningkatkan resolusi pada grafik.

Seperti yang Anda lihat, gambar konsisten dengan apa yang dijelaskan dalam uraian di atas. Anda dapat mulai memproses data.
Decoding
Pertama, Anda perlu mendapatkan bitstream. Sinyal itu sendiri dikodekan menggunakan manchester encoding:

Dari perbedaan level dalam camilan, mudah untuk mendapatkan "0" dan "1" yang nyata.
bits_str = "" for p in range(8): pos = start_data + bit_len*p p1, p2 = A[pos: pos + bit_len/2], A[pos + bit_len/2: pos + bit_len] avg1, avg2 = np.average(p1), np.average(p2) if avg1 < avg2: bits_str += "0" elif avg1 > avg2: bits_str += "1"
Struktur sinyal itu sendiri adalah sebagai berikut:

Mari kita perhatikan kolom-kolomnya lebih detail.
DF (Downlink Format, 5 bit) - mendefinisikan jenis pesan. Ada beberapa jenis:

(
sumber tabel )
Kami hanya tertarik pada tipe DF17, seperti ini berisi koordinat pesawat.
ICAO (24 bit) adalah kode pesawat unik internasional. Anda dapat memeriksa pesawat dengan kodenya
di situs web (sayangnya, penulis telah berhenti memperbarui database, tetapi masih relevan). Misalnya, untuk kode 3c5ee2 kami memiliki informasi berikut:

Sunting: dalam
komentar pada artikel, deskripsi kode ICAO diberikan secara lebih rinci, saya sarankan Anda membacanya untuk mereka yang tertarik.
DATA (56 atau 112 bit) - sebenarnya data yang akan kami dekode. 5 bit pertama data adalah bidang
Kode Jenis yang berisi subtipe dari data yang disimpan (jangan dikacaukan dengan DF). Ada beberapa jenis ini:

(
sumber tabel )
Mari kita lihat beberapa paket contoh.
Identifikasi pesawatContoh biner:
00100 011 000101 010111 000111 110111 110001 111000
Bidang Data:
+------+------+------+------+------+------+------+------+------+------+ | TC,5 | EC,3 | C1,6 | C2,6 | C3,6 | C4,6 | C5,6 | C6,6 | C7,6 | C8,6 | +------+------+------+------+------+------+------+------+------+------+
TC = 00100b = 4, setiap karakter C1-C8 berisi kode yang sesuai dengan indeks dalam string:
#ABCDEFGHIJKLMNOPQRSTUVWXYZ ##### _ ################ 0123456789 ######
Setelah memecahkan kode baris, mudah untuk mendapatkan kode pesawat: EWG7184
symbols = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789######" code_str = "" for p in range(8): c = int(bits_str[8 + 6*p:8 + 6*(p + 1)], 2) code_str += symbols[c] print("Aircraft Identification:", code_str.replace('#', ''))
Posisi di udaraJika namanya sederhana, maka koordinatnya lebih rumit. Mereka ditransmisikan dalam bentuk frame 2x, genap dan ganjil. Kode bidang TC = 01011b = 11.

Contoh paket genap dan ganjil:
01011 000 000101110110 00 10111000111001000 10000110101111001 01011 000 000110010000 01 10010011110000110 10000011110001000
Penghitungan koordinat dilakukan berdasarkan rumus yang agak pintar:

(
sumber )
Saya bukan spesialis GIS, jadi saya tidak tahu dari mana asalnya. Siapa yang tahu, tulis di komentar.
Ketinggian dianggap lebih mudah - tergantung pada bit tertentu, itu dapat muncul sebagai kelipatan 25 atau 100 kaki.
Kecepatan udaraPaket dengan TC = 19. Yang menarik di sini adalah bahwa kecepatannya bisa akurat, relatif terhadap ground (Kecepatan Tanah), atau udara, yang diukur dengan sensor pesawat (Kecepatan Udara). Banyak bidang yang berbeda juga ditransmisikan:

(
sumber )
Kesimpulan
Seperti yang Anda lihat, teknologi ADS-B telah menjadi simbiosis yang menarik ketika standar berguna tidak hanya untuk para profesional, tetapi juga untuk pengguna biasa. Tapi tentu saja, peran utama dalam hal ini dimainkan oleh semakin murahnya teknologi penerima SDR digital, yang memungkinkan perangkat untuk menerima sinyal dengan frekuensi yang lebih tinggi daripada gigahertz pada perangkat yang secara harfiah “untuk satu sen”.
Dalam standar itu sendiri, tentu saja, lebih dari segalanya. Mereka yang tertarik dapat melihat PDF di halaman
ICAO atau mengunjungi
situs yang telah disebutkan di atas.
Rasanya tidak mungkin banyak hal di atas berguna, tetapi setidaknya gagasan umum tentang cara kerjanya, saya harap, tetap ada.
Omong-omong, dekoder siap pakai dengan Python sudah ada, dapat dipelajari di
sini . Dan pemilik penerima SDR dapat merakit dan menjalankan dekoder ADS-B yang telah selesai
dari halaman , lebih lanjut tentang ini di bagian
pertama .
Kode sumber parser yang dijelaskan dalam artikel diberikan di bawah potongan. Ini adalah contoh pengujian yang tidak berpura-pura menjadi produksi, tetapi sesuatu berfungsi di dalamnya, dan Anda dapat mengurai file yang direkam di atas.
Kode Sumber (Python) from __future__ import print_function from scipy.io import wavfile from scipy import signal import matplotlib.pyplot as plt import numpy as np import math import sys def parse_message(data, start, bit_len): max_len = bit_len*128 A = data[start:start + max_len] A = signal.resample(A, 10*max_len) bits = np.zeros(10*max_len) bit_len *= 10 start_data = bit_len*8
Semoga ada yang tertarik, terima kasih atas perhatiannya.