SDR ile İlk Adımlar: RTL-SDR’dan ADS-B Takibine

"Life of a Software Developer"

Software Defined Radio (SDR), radyo alıcısının donanım fonksiyonlarını yazılıma taşıyan bir yaklaşımdır. Geleneksel bir radyo alıcısında frekans seçimi, demodülasyon ve filtreleme analog devrelerle yapılırken, SDR’da bu işlemlerin büyük kısmı dijital sinyal işleme (DSP) ile yazılımda gerçekleştirilir. Bu da aynı donanımla FM radyo dinlemekten uçak takibine, uydu sinyali çözümlemeden IoT cihaz analizine kadar her şeyi yapabilmeniz anlamına gelir.

Ve en güzel tarafı: başlamak için basit bir USB cihaz yeterli.

RTL-SDR Nedir?

RTL-SDR, orijinal olarak DVB-T (dijital TV) alıcısı olarak tasarlanmış USB cihazların, genel amaçlı SDR alıcısı olarak kullanılmasını sağlayan bir hack’ten doğdu. Realtek RTL2832U çipi ve bir RF tuner (genelde R820T2) içeren bu cihazlar, ham IQ (In-phase / Quadrature) verisi üretebilir.

RTL-SDR V3 veya V4 modelleri günümüzde en yaygın başlangıç cihazlarıdır. Frekans aralığı yaklaşık 24 MHz – 1.766 GHz, bant genişliği 2.4 MHz (kararlı), 3.2 MHz (oversampling ile) ve ADC çözünürlüğü 8 bit’tir. Fiyat/performans oranı düşünüldüğünde öğrenme ve hobi projeleri için idealdir. Profesyonel uygulamalar için HackRF, USRP veya LimeSDR gibi daha gelişmiş cihazlara bakılabilir.

IQ Verisi: Temel Kavram

SDR dünyasının temel veri formatı IQ (In-phase / Quadrature) verisidir. Bu kavramı anlamadan SDR’da verimli çalışmak zordur.

Bir radyo sinyali, belirli bir frekanstaki taşıyıcı dalganın genlik, faz veya frekans modülasyonu ile bilgi taşımasıdır. Bu sinyali dijitale çevirirken, sinyalin hem genliğini hem de fazını korumamız gerekir. IQ temsili tam olarak bunu yapar.

I (In-phase) bileşeni taşıyıcı ile aynı fazda olan sinyal bileşenidir. Q (Quadrature) bileşeni ise taşıyıcıya 90° faz farkıyla olan bileşendir. Bu ikisi birlikte, sinyalin tam bilgisini — genlik ve faz — taşır.

Matematiksel olarak: s(t) = I(t)·cos(2πft) - Q(t)·sin(2πft). I ve Q’dan sinyalin anlık genliğini (√(I² + Q²)) ve anlık fazını (arctan(Q/I)) hesaplayabilirsiniz.

RTL-SDR’dan gelen ham veri, 8-bit unsigned integer çiftleri olarak I ve Q örneklerini içerir (IQIQIQ…). Her örnek çifti, belirli bir andaki sinyalin tam temsilini verir. Örnekleme hızı (sample rate), Nyquist teoremine göre yakalayabileceğiniz maksimum bant genişliğini belirler: 2.4 Msps (mega sample per second) ile 2.4 MHz bant genişliği yakalarsınız.

RTL-SDR Kurulumu

bash
# Debian/Ubuntu
sudo apt install rtl-sdr librtlsdr-dev

# Kernel'ın DVB-T sürücüsünü devre dışı bırakma
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-rtlsdr.conf
echo 'blacklist rtl2832' | sudo tee -a /etc/modprobe.d/blacklist-rtlsdr.conf
sudo modprobe -r dvb_usb_rtl28xxu rtl2832 2>/dev/null

# Cihaz testi
rtl_test -t
# "Found 1 device(s)" ve "No E4000 tuner found, using R820T" 
# benzeri bir çıktı görmelisiniz

# Basit FM radyo dinleme (örnek)
rtl_fm -f 96.2M -M wbfm -s 200000 -r 48000 | aplay -r 48000 -f S16_LE

rtl_test komutu cihazın çalıştığını doğrular. -t parametresi E4000 tuner testi yapar. -p parametresi frekans sapmasını (PPM) ölçer — bu değer ADS-B gibi hassas uygulamalarda önemlidir.

ADS-B: Uçakları Dinlemek

ADS-B (Automatic Dependent Surveillance-Broadcast), uçakların pozisyon, hız, irtifa ve kimlik bilgilerini otomatik olarak yayınladığı bir gözetim sistemidir. “Automatic” çünkü pilot müdahalesi gerektirmez; “Dependent” çünkü GPS’e bağımlıdır; “Surveillance” çünkü gözetim amaçlıdır; “Broadcast” çünkü bilgi herkese açık olarak yayınlanır.

ADS-B sinyalleri 1090 MHz frekansta, Mode S Extended Squitter formatında yayınlanır. Her mesaj 112 bit uzunluğundadır ve PPM (Pulse Position Modulation) ile modüle edilir. Sinyal yapısı: 8 μs preamble + 56 veya 112 bit veri.

ADS-B mesaj tipleri çeşitlidir. Airborne Position mesajı (DF17, TC 9-18) enlem, boylam ve irtifa bilgisi taşır. Surface Position mesajı (TC 5-8) yerdeki uçakların konumunu verir. Airborne Velocity mesajı (TC 19) hız ve yön bilgisi taşır. Aircraft Identification mesajı (TC 1-4) uçağın callsign’ını içerir.

Bir RTL-SDR ile bu sinyalleri yakalayıp çözmek düşündüğünüzden daha basittir.

dump1090 ile ADS-B Çözümleme

dump1090, ADS-B sinyallerini gerçek zamanlı olarak çözen popüler bir açık kaynak yazılımdır. Birkaç fork’u vardır; en aktif olanı dump1090-mutability veya dump1090-fa (FlightAware fork’u) olabilir.

bash
# dump1090-fa kurulumu
git clone https://github.com/flightaware/dump1090.git
cd dump1090
make
sudo make install

# Çalıştırma — web arayüzü ile
./dump1090 --interactive --net

# veya arka planda
./dump1090 --net --quiet &

# Web arayüzü: http://localhost:8080
# Harita üzerinde uçakları gerçek zamanlı görebilirsiniz

dump1090 çalıştığında birkaç çıktı sunar. Terminal’de interaktif mod ile yakalanan her uçağın ICAO adresini, callsign’ını, irtifasını, hızını ve pozisyonunu görebilirsiniz. Web arayüzü harita üzerinde uçakları gösterir. Ayrıca 30003 portunda BaseStation formatında ve 30005 portunda Beast binary formatında veri akışı sunar.

Hex    Mode  Sqwk  Flight   Alt    Spd  Hdg  Lat      Lon      Sig  Msgs  Ti
────────────────────────────────────────────────────────────────────────────────
4B1A3C  S          THY6425  38025  465  275  39.945   32.823   -3.2  127   2
4B1817  S          THY312   35000  498  312  40.123   32.456   -5.1   84   0

Anten Optimizasyonu

RTL-SDR ile birlikte gelen manyetik tabanlı anten, geniş bant için tasarlanmıştır ve ADS-B performansı sınırlı olacaktır. Menzili artırmak için 1090 MHz’e özel bir anten yapmak veya satın almak büyük fark yaratır.

En basit DIY çözüm çeyrek dalga ground plane antendir. 1090 MHz için elemanların uzunluğu yaklaşık 6.9 cm’dir (c / (4 × f) = 3×10⁸ / (4 × 1.09×10⁹) ≈ 0.0688 m). Bir adet dikey eleman ve 4 adet yatay (veya hafif aşağı eğimli) radial eleman, bir N-tipi veya SMA konnektör üzerine lehimlenerek yapılabilir.

Çeyrek dalga hesabı:
λ = c / f = 3e8 / 1.09e9 = 0.2752 m
λ/4 = 0.0688 m ≈ 6.9 cm

Malzeme: 2.5mm bakır tel veya pirinç çubuk
Radial açısı: yataydan 45° aşağı doğru

Bu basit anten bile dahili antene göre menzili 2-3 kat artırabilir. Antenin mümkün olduğunca yükseğe ve açık bir yere konması da önemlidir — her 3 metre yükseklik kazanımı yaklaşık %10 daha fazla menzil demektir (line-of-sight prensibi).

Daha gelişmiş çözümler: collinear coax antenna (birden fazla elemanı seri bağlayarak daha yüksek kazanç sağlar), cavity bandpass filter (1090 MHz dışındaki sinyalleri bastırır) ve LNA (Low Noise Amplifier — anten ile RTL-SDR arasına yerleştirilir, sinyal/gürültü oranını artırır).

Python ile ADS-B Verisi İşleme

dump1090’ın ağ çıktısını Python ile yakalayarak kendi analizlerinizi yapabilirsiniz.

python
import socket
import csv
from datetime import datetime
from io import StringIO

def connect_dump1090(host='127.0.0.1', port=30003):
    """dump1090 BaseStation formatında veri akışına bağlan"""
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))
    buffer = ''
    
    while True:
        data = sock.recv(4096).decode('utf-8', errors='ignore')
        if not data:
            break
        buffer += data
        while '\n' in buffer:
            line, buffer = buffer.split('\n', 1)
            yield parse_basestation(line.strip())

def parse_basestation(line):
    """BaseStation CSV formatını parse et"""
    fields = line.split(',')
    if len(fields) < 22:
        return None
    
    msg_type = fields[0]  # MSG
    transmission_type = fields[1]  # 1-8
    icao = fields[4]  # ICAO 24-bit adres
    callsign = fields[10].strip() if fields[10] else None
    altitude = int(fields[11]) if fields[11] else None
    speed = float(fields[12]) if fields[12] else None
    heading = float(fields[13]) if fields[13] else None
    lat = float(fields[14]) if fields[14] else None
    lon = float(fields[15]) if fields[15] else None
    vertical_rate = int(fields[16]) if fields[16] else None
    
    return {
        'timestamp': datetime.now().isoformat(),
        'icao': icao,
        'callsign': callsign,
        'altitude_ft': altitude,
        'speed_kt': speed,
        'heading': heading,
        'lat': lat,
        'lon': lon,
        'vertical_rate': vertical_rate
    }

# Kullanım
for msg in connect_dump1090():
    if msg and msg['lat']:
        print(f"{msg['callsign'] or msg['icao']:>8s} | "
              f"Alt: {msg['altitude_ft']:>6d} ft | "
              f"Spd: {msg['speed_kt']:>5.0f} kt | "
              f"Pos: {msg['lat']:.4f}, {msg['lon']:.4f}")

Bu script’i genişleterek uçuş verilerini veritabanına kaydetme, belirli uçak veya rotaları izleme, irtifa/hız anomalilerini tespit etme veya harita üzerinde görselleştirme yapabilirsiniz.

Daha İleri: pyModeS ile Paket Çözümleme

Daha düşük seviyede ADS-B mesajlarını çözmek istiyorsanız, pyModeS kütüphanesi mükemmel bir araçtır.

python
import pyModeS as pms

# Örnek ADS-B mesajı (hex)
msg = "8D4840D6202CC371C32CE0576098"

# ICAO adresini çıkar
icao = pms.adsb.icao(msg)
print(f"ICAO: {icao}")  # 4840D6

# Mesaj tipini belirle
tc = pms.adsb.typecode(msg)
print(f"Type Code: {tc}")  # 4 -> Aircraft Identification

# Callsign çıkar (TC 1-4)
if 1 <= tc <= 4:
    callsign = pms.adsb.callsign(msg)
    print(f"Callsign: {callsign}")

# Pozisyon çözümlemesi (iki mesaj gerekir — even ve odd)
msg_even = "8D40621D58C382D690C8AC2863A7"
msg_odd  = "8D40621D58C386435CC412692AD6"
t_even = 1457996402
t_odd  = 1457996400

pos = pms.adsb.position(msg_even, msg_odd, t_even, t_odd)
if pos:
    lat, lon = pos
    print(f"Position: {lat:.4f}, {lon:.4f}")

# Hız ve yön (TC 19)
msg_vel = "8D485020994409940838175B284F"
velocity = pms.adsb.velocity(msg_vel)
if velocity:
    speed, heading, vrate, speed_type = velocity
    print(f"Speed: {speed} kt, Heading: {heading}°, VRate: {vrate} ft/min")

Yasal Çerçeve

Türkiye’de SDR kullanımına ilişkin bazı önemli noktalar:

Radyo sinyallerini almak (receive) genel olarak yasaldır. Ancak bazı frekans bantlarının dinlenmesi kısıtlı olabilir — özellikle askeri, güvenlik ve özel haberleşme frekansları. ADS-B sinyallerini almak yasal ve hatta FlightAware, Flightradar24 gibi platformlar gönüllü ADS-B alıcılarını teşvik eder.

Önemli olan: SDR ile sinyal göndermek (transmit) kesinlikle lisanslı frekanslar ve amatör telsiz lisansı dışında yasadışıdır. RTL-SDR zaten sadece alıcıdır (receive-only), bu yüzden bu konuda bir risk yoktur. Ama HackRF gibi göndericili cihazlar kullanılıyorsa, yasal sınırları bilmek kritiktir.

BTK (Bilgi Teknolojileri ve İletişim Kurumu) Türkiye’de frekans yönetiminden sorumlu kurumdur. Amatör telsiz lisansı almak istiyorsanız BTK’nın amatör telsizcilik sınavlarına başvurabilirsiniz.

İleri Projeler

RTL-SDR ve ADS-B ile başladıktan sonra deneyebileceğiniz projeler:

Hava durumu uyduları: NOAA APT sinyallerini 137 MHz civarında yakalayarak doğrudan uydudan hava durumu görüntüleri elde edebilirsiniz. Meteoroloji uyduları görünür ışık ve kızılötesi görüntüleri sürekli yayınlar.

AIS (Automatic Identification System): Deniz trafiği takibi. 161-162 MHz bandında gemi pozisyonlarını yakalayabilirsiniz.

Trunked radio: P25, DMR, TETRA gibi dijital trunked telsiz sistemlerini çözmek (yasal sınırlar dahilinde).

SIGINT/ELINT pratiği: Bilinmeyen sinyalleri tespit etme, modülasyon türünü belirleme ve çözümleme — ileride CNN ile sinyal sınıflandırma yazımızda bu konuya daha teknik açıdan yaklaşacağız.

Sonuç

SDR, radyo dünyasını yazılım mühendislerine açan harika bir teknoloji. 200 TL’lik bir RTL-SDR ile başlayarak ADS-B uçak takibinden uydu görüntülemeye, sinyal analizinden IoT güvenlik testlerine kadar geniş bir yelpazede projeler yapabilirsiniz. Bu yazıda temelleri attık — ilerleyen yazılarda SDR verisi ile makine öğrenmesi kullanarak sinyal sınıflandırma yapacağız.

Scroll to top