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
# 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.
# 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.
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.
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.






