Saya akan menebak dan mengatakan bahwa setiap orang yang teman atau keluarganya pernah terbang dengan pesawat, telah menggunakan Flightradar24 - layanan gratis dan nyaman untuk melacak penerbangan secara real time.

Pada bagian
pertama ide-ide dasar operasi dijelaskan. Sekarang mari kita melangkah lebih jauh dan mencari tahu, data apa yang sebenarnya mengirim dan menerima antara pesawat dan stasiun darat. Kami juga akan mendekode data ini menggunakan Python.
Sejarah
Seharusnya jelas bahwa data pesawat tidak dimaksudkan hanya untuk pengguna, yang ingin melihatnya di smartphone mereka. Sistem ini disebut ADS - B (Siaran pengawasan otomatis - siaran), dan dirancang untuk mentransmisikan data informasi pesawat secara otomatis ke pusat kendali - parameter yang berbeda, seperti koordinat, kecepatan, heading, ketinggian, dan lainnya, sedang dikirim. Sebelumnya, operator hanya bisa melihat titik di layar radar. Dan itu pasti tidak cukup ketika jumlah pesawat meningkat secara drastis.
Secara teknis, ADS-B terdiri dari pemancar di dalam pesawat, yang secara berkala mengirimkan bingkai data informasi pada frekuensi yang relatif tinggi 1090 MHz (ada beberapa mode lain, tetapi mereka tidak begitu menarik bagi kami, karena koordinatnya hanya dikirimkan di sini ) Tentu saja, ada juga penerima di suatu tempat di bandara, tetapi bagi kami, seperti bagi pengguna, penerima kami sendiri lebih menarik.
Sebagai perbandingan, sistem pertama yang dirancang untuk pengguna biasa, Airnav Radarbox, muncul pada 2007, dan berharga sekitar $ 900, dan sekitar $ 250 per tahun dikenakan biaya berlangganan layanan jaringan mereka (ide utama sistem ini adalah untuk mengumpulkan dan berbagi data dari
banyak penerima ,
penerima yang berdiri sendiri relatif tidak berguna).

Sekarang, ketika penerima RTL-SDR menjadi lebih banyak tersedia, perangkat serupa dapat dibuat seharga $ 30. Itu dapat ditemukan di bagian
pertama artikel , dan kita akan melangkah lebih jauh dan menggambarkan protokol itu sendiri - mari kita lihat cara kerjanya.
Menerima sinyal
Pertama, kita perlu merekam sampel sinyal. Seluruh sinyal hanya memiliki panjang 120 mikrodetik, dan untuk melihat rinciannya dalam "resolusi" yang baik, lebih baik untuk memiliki radio SDR dengan sampel rate minimal 5 MHz.

Setelah merekam, kami mendapatkan file WAV dengan sampling rate 5.000.000 sampel / detik, 30 detik dari catatan tersebut memiliki ukuran sekitar 500MB. Tentu saja, tidak ada gunanya untuk mendengarkannya dengan pemutar media favorit Anda - file tersebut tidak mengandung suara, tetapi sinyal radio yang langsung didigitalkan sendiri - ini persis cara Radio Didefinisikan Perangkat Lunak bekerja.
Kami dapat membuka dan memproses file ini dengan Python. Mereka yang ingin melakukan percobaan sendiri, dapat mengunduh sampel dari
tautan ini .
Mari kita buka 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 beberapa 'impuls' atas kebisingan.

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

Seperti yang dapat kita lihat, gambar sepenuhnya konsisten dengan uraian di atas. Kami sekarang dapat memproses data ini.
Decoding
Pertama, kita perlu memiliki sedikit aliran. Sinyal itu sendiri dikodekan dengan pengkodean manchester:

Dari perbedaan setengah gigitan kita dapat dengan mudah 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 terlihat seperti ini:

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

(
sumber halaman )
Kami hanya tertarik pada tipe DF17, karena hanya yang ini berisi koordinat pesawat.
ICAO (24 bit) - adalah kode pesawat internasional yang unik. Kami dapat memeriksa pesawat dengan kodenya
di situs web ini (sayangnya, penulis telah berhenti memperbarui database, tetapi masih relevan). Misalnya, untuk kode 3c5ee2 kita dapat memiliki informasi berikut:
DATA (56 atau 112 bit) - adalah data itu sendiri, yang akan kami dekode. 5 bit pertama data adalah bidang
Kode Jenis , yang berisi subtipe dari data yang disimpan (tidak dicampur dengan bidang
DF ). Ada banyak jenis seperti itu:

(
sumber tabel )
Mari kita lihat beberapa contoh.
Identifikasi pesawatContoh dalam bentuk 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, dan setiap simbol C1-C8 berisi kode, yang harus cocok dengan indeks dalam string ini:
#ABCDEFGHIJKLMNOPQRSTUVWXYZ ##### _ ################ 0123456789 ######
Setelah decoding, mudah untuk mendapatkan nama 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 udaraNama decoding sederhana, tetapi koordinatnya lebih rumit. Mereka ditransmisikan dalam bentuk 2 frame, genap dan ganjil. Kode bidang TC = 01011b = 11.

Contoh frame data genap dan ganjil:
01011 000 000101110110 00 10111000111001000 10000110101111001 01011 000 000110010000 01 10010011110000110 10000011110001000
Perhitungan koordinat itu sendiri menggunakan rumus agak rumit:

(
sumber )
Saya bukan ahli GIS, jadi saya tidak tahu dari mana asalnya. Siapa tahu lebih baik, silakan tulis komentar.
Perhitungan ketinggian lebih sederhana - tergantung pada bit tertentu, dapat direpresentasikan sebagai kelipatan 25 atau 100 kaki.
Kecepatan udaraDataframe dengan TC = 19. Yang menarik di sini adalah bahwa kecepatan dapat relatif ke tanah (lebih akurat, disebut Kecepatan Tanah), dan Kecepatan Udara, diukur oleh sensor udara pesawat (bisa kurang akurat karena angin). Banyak bidang lain yang berbeda juga ditransmisikan:

(
sumber )
Kesimpulan
Seperti yang dapat kita lihat, teknologi ADS-B telah menjadi simbiosis yang menarik, ketika standar dapat digunakan secara luas tidak hanya untuk para profesional, tetapi juga untuk pengguna biasa. Tapi yang pasti, peran utama dalam hal ini dilakukan oleh semakin murahnya teknologi penerima SDR digital, yang memungkinkan untuk menerima sinyal dengan frekuensi lebih tinggi daripada gigahertz pada perangkat yang sangat murah.
Standar itu sendiri, tentu saja, memiliki lebih banyak data. Mereka yang tertarik dapat melihat PDF di halaman
ICAO atau mengunjungi
situs web mode-s.org yang telah disebutkan di atas. Sepertinya artikel ini tidak akan benar-benar digunakan oleh sebagian besar pembaca, tetapi saya harap, setidaknya gagasan umum tentang cara kerjanya, sekarang lebih jelas.
Omong-omong, dekoder ADS-B Python sudah ada, dapat diselidiki
di github . Pemilik penerima SDR juga dapat membangun dan menjalankan dekoder ADS-B yang siap digunakan
dari halaman ini , dan (saya akan ulangi lagi) beberapa detail yang kami juga di
bagian pertama artikel ini.
Kode sumber parser, dijelaskan di atas, diberikan di bawah spoiler. Ini hanya contoh uji yang tidak berpura-pura dengan kualitas produksi, tetapi secara umum berfungsi, dan dapat mengurai
file WAV , yang dicatat 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 bermanfaat, terima kasih sudah membaca.