SDR üzerinden canlı IQ verisi alıp ONNX modeliyle modülasyon tanıma (ED) yapan, yön bulma / karıştırma / aldatma panellerini içeren PyQt6 arayüzü.
git clone https://github.com/bugraq/teknofest_eh.gitcd teknofest_eh && python -m venv .venvSanal ortamı aktif et:
.venv\Scripts\activate(Linux/macOS: source .venv/bin/activate)
pip install -r requirements.txtPython 3.10+ önerilir.
ONNX modeli repoya dahildir, ayrıca indirmene gerek yok:
data/model.onnx— model grafiğidata/model.onnx.data— ağırlıklar (~16 MB, ikisi de aynı klasörde durmalı)
Model bulunamazsa uygulama çökmez, [AI ENGINE UYARISI] basıp simülasyon
(Fake AI) moduna düşer — yani ekranda gördüğün modülasyon sonuçları rastgeledir.
Açılışta konsolda [AI ENGINE] ONNX Modeli yüklendi! satırını görüyorsan gerçek
model çalışıyor demektir.
python main.pyUygulama SDR donanımına doğrudan bağlanmaz; araya ZMQ ile GNU Radio girer.
| Yön | Port | Protokol | Format |
|---|---|---|---|
| RX (SDR → uygulama) | tcp://127.0.0.1:5555 |
ZMQ PUB/SUB — uygulama SUB | complex64 akış |
| TX (uygulama → SDR) | tcp://127.0.0.1:5556 |
ZMQ — uygulama yayıncı | komut |
GNU Radio Companion tarafında akış şu şekilde kurulur:
[ Osmocom/SoapySDR Source ] → [ ZMQ PUB Sink: tcp://127.0.0.1:5555 ]
Önemli noktalar:
- GNU Radio çıkışı complex64 olmalı (ZMQ PUB Sink varsayılanı).
- Örnekleme hızı
config.pyiçindekiSAMPLE_RATE(500 kHz) ile aynı olsun. - Uygulama her mesajdan
config.SDR_SEGMENT_LEN(8192) örnek alır; GNU Radio tarafında vector length'i buna eşit ya da daha büyük tut, küçük olursa segment atlanır. - Merkez frekansı
config.FC_TO_BANDiçindeki bantlardan biri olmalı (433 MHz / 868 MHz / 915 MHz / 2.4 GHz).
GNU Radio yayın yapmıyorsa uygulama açılır ama ED paneli boş kalır — hata vermez, sadece veri beklemeye geçer.
hardware/ altında HackRF, PlutoSDR ve USRP için sürücü sarmalayıcıları var.
Kullanacağın cihazın kendi sürücüsü (ör. HackRF için libhackrf + gr-osmosdr)
sistemde ayrıca kurulu olmalı.
config.py eğitim ve çıkarım tarafının ortak ayar dosyasıdır. Sahada
çalıştırmadan önce iki ayarı mutlaka kontrol edin:
SDR_CENTER_FREQ_HZ = 915_000_000.0 # Pluto 2.4 GHz'deyse: 2_400_000_000.0Bu değer elle girilir, çünkü sistem bunu veriden çıkaramaz: Pluto karıştırıcıdan sonra baseband örnek verir, bu örnekler merkez frekans bilgisi taşımaz. 915 MHz'den de 2.4 GHz'den de alsanız örnekler aynı görünür.
Ekranda gösterilen mutlak frekans = SDR_CENTER_FREQ_HZ + (FFT'den ölçülen ofset).
Yani donanımı 2.4 GHz'e alıp burayı 915 MHz'de bırakırsanız frekans yanlış gösterilir.
Modelde bir
band_logitsçıkışı var ama kullanılmıyor. Yukarıdaki sebeple o başlık bandı gerçekten bilemez, eğitim setindeki tesadüfi korelasyonu öğrenmiştir. Band her zaman ölçümden gelir. Model farklı bir band söylerse konsola uyarı düşer.
SIMULATION_MODE = FalseFalse (varsayılan): arayüz sadece SDR'dan gerçek veri geldiğinde tespit gösterir.
Veri yokken ekran boş kalır, DF tarama modunda bekler — uydurma tespit üretilmez.
True: donanım yokken demo/geliştirme için sahte sinyal akıtır. Yarışmada açık
unutulursa ekranda gerçek olmayan tespitler akar.
HOME_LAT, HOME_LON = 38.6810, 39.2264 # Elazığ merkez — sistemin kurulu olduğu yer
SPOOF_TARGET_LAT, ... = 38.6100, 39.2900 # Elazığ Havalimanı — sahte konumun gideceği yer (~9-10 km)
SPOOF_DRIFT_DURATION_S = 120.0 # Kayma bu sürede hedefe varır
MAP_AREA_SIZE_M = 1000.0 # Harita 1 km²'lik alanı gösterirDiğer ayarlar (örnekleme hızı, normalizasyon, sınıf isimleri, segment uzunluğu) da bu dosyadadır.
Arayüz gerçek ölçüm geldiğinde otomatik olarak ona geçer; GUI kodunda değişiklik
gerekmez. Donanım tarafı sadece StateManager'a yazar:
# Anten dizisi / AOA çözücüsü — gerçek geliş açısı
state_manager.update_df_state(bearing_deg=127.5, rms_deg=1.8)
state_manager.clear_df_state() # veri kesilince
# TDoA / AOA çözümü — hedefin mutlak konumu
state_manager.update_target_position(lat=38.6801, lon=39.2290, err_m=45.0)
# GPS alıcı — KENDİ konumumuz
state_manager.update_own_position(lat=38.6748, lon=39.2226, alt=1067,
fix=True, sats=9)Bu çağrılar yapılmadığı sürece:
- Pusula tarama modunda kalır, uydurma açı üretmez.
- Haritaya hedef düşmez.
- Kendi konumumuz
config.HOME_*(Elazığ) kabul edilir.
update_own_position() ile update_gps_spoof_state() karıştırılmamalıdır:
ilki bizim gerçek yerimiz, ikincisi karşıya yaydığımız sahte konum.
Yön bulma panelinde gösterilen açının nereden geldiği yazar:
| Rozet | Anlamı |
|---|---|
● ANTEN ÖLÇÜMÜ (yeşil) |
Gerçek donanım verisi |
▲ SİMÜLASYON — ÖLÇÜM DEĞİL (turuncu) |
Yer tutucu, SIMULATION_MODE=True iken |
● VERİ YOK (gri) |
Ölçüm gelmiyor, tarama modunda |
Bu rozet bilerek konuldu: simülasyon ekranda ölçüm gibi görünürse hem hakem önünde hem ekip içinde yanlış anlaşılır.
Sinyal/normalizasyon ayarlarını değiştirirseniz model yeniden eğitilmelidir.
main.py Uygulama girişi (buffer + AI + SDR + GUI'yi kurar)
config.py Ortak konfigürasyon (eğitim & çıkarım)
core/ Dairesel buffer, durum yöneticisi, loglama
sdr_comms/ ZMQ alıcı / verici
ai_engine/ Önişleme, ONNX çıkarım, karar motoru
ed_module/ Sinyal tespiti, AOA/TDOA yön bulma, DSP
et_module/ Jammer, GPS/telsiz aldatma, dalga formu üretimi
hardware/ HackRF / Pluto / USRP sürücüleri
gui/ Ana pencere ve paneller
data/ ONNX modeli (ham IQ kayıtları repoya dahil değildir)
| Belirti | Sebep |
|---|---|
[AI ENGINE UYARISI] ... yüklenemedi |
data/model.onnx.data eksik ya da onnxruntime kurulu değil |
| Pencere açılıyor, ED paneli boş | GNU Radio 5555'ten yayın yapmıyor (beklenen davranış — sinyal gelince dolar) |
| Frekans yanlış gösteriliyor | config.SDR_CENTER_FREQ_HZ donanımdaki merkez frekansla aynı değil |
| Açılışta rastgele tespitler akıyor | config.SIMULATION_MODE = True kalmış, False yapın |
| Sinyal var ama tespit gelmiyor | SNR eşiği yüksek olabilir: config.DETECTION_THRESHOLD_DB düşürün |
ModuleNotFoundError: PyQt6 |
Sanal ortam aktif değil ya da pip install -r requirements.txt çalıştırılmadı |
| Harita paneli boş | PyQt6-WebEngine kurulu değil |