Necháte přijímač běžet přes noc a ráno si v telefonu projdete, co se na pásmu dělo. K tomu slouží GlobalScanRX, open source projekt, který z RTL-SDR donglů dělá automatický skener s webovým archivem nahrávek.

Autorem článku je Dominik Čampa (TikTok @garryfreak). Článek není placenou spoluprací, projekt autor financuje sám.
Jak to vzniklo
K rádiu jsem měl blízko od dětství. Táta mi půjčoval starou radiostanici Alinco po dědovi a poslouchali jsme na ní hasiče nebo radioamatérský převaděč OK0D na Lysé hoře. Fascinovalo mě, že slyším lidi kilometry daleko a nepotřebuji k tomu internet ani mobilní síť. Zájem o rádio mi vydržel dodnes.
Ve třinácti jsem objevil SDR a spektrum najednou viděl na monitoru. Na GlobalScanRX, respektive jeho předchůdcích, pracuji zhruba od roku 2020. Profesně dělám v IT, elektronika, rádio a programování jsou koníčky. Dřív jsem všechno psal ručně, dnes mi s vývojem pomáhá AI.
GlobalScanRX je pořád ve vývoji a testování, zatím to není hotový produkt.
Jak GlobalScanRX funguje
Projekt má dvě části. Klient běží u USB přijímačů, skenuje nastavená pásma, nahrává a výsledky posílá dál. Server provozuje webové rozhraní, uživatelské účty a nastavení a ukládá nahrávky. Obojí může běžet na jednom počítači, nebo k jednomu serveru připojíte několik vzdálených stanovišť.
Každé SDR má vlastní pásma. Grafický editor ukazuje střed i šířku pokrytí, výchozí je 2,048 MHz. Na jedno SDR jdou nejvýš čtyři pásma, doporučuji ale tři.
Během nahrávání se další skenování na daném SDR zastaví, takže krátké vysílání na jiném pásmu se nezachytí. S každým dalším pásmem navíc přijímač stráví na jednotlivých kmitočtech méně času. Pro důležité pásmo proto použijte samostatný dongle.
Sám zkouším okolí 145, 172, 442 a 448 MHz a láká mě i letecké pásmo. To jsou moje nastavení, program žádné pevné frekvence nemá.

Při výpadku spojení se serverem klient dál skenuje podle uložené konfigurace a nahrávky odešle po obnovení spojení. Výchozí fronta má limit 512 MB a nahrávky v ní vydrží 15 minut. Pro delší výpadky je potřeba limity zvýšit, jinak se starší soubory smažou.
Ráno vyberete den a posloucháte
Na dashboardu vyberete včerejšek a v hodinovém grafu uvidíte, kdy vznikaly nahrávky. Klepnutím na sloupec vyberete hodinu, hledání zúžíte podle přijímače, názvu kanálu nebo kmitočtu. Karta nahrávky má pohromadě čas, přijímač, kmitočet, název kanálu a přehrávač. Zvuk jde stáhnout jako MP3.
Kanály si pojmenujete podle toho, co váš přijímač opravdu slyší, třeba OM0OVU Krížava. Název patří k vašemu přijímači, stejný kmitočet totiž na druhém konci republiky může znamenat něco úplně jiného.

Kmitočet, který nahrávat nechcete, může vlastník nebo administrátor zablokovat. Klient pak ignoruje detekce v okolí ±5 kHz. POZOR! Blokování zároveň smaže všechny odpovídající nahrávky na serveru, včetně zvuku a obrázků.
Přehrávač s vodopádem
Obyčejný posuvník mi nestačil. Přehrávač ukazuje skutečnou zvukovou vlnu, do které klepnete nebo po ní táhnete, myší i prstem.
Zajímalo mě ale i to, jak signál vypadal. Se zapnutým ukládáním vodopádů klient přiloží k analogové nahrávce úzký výřez spektra kolem jejího kmitočtu. Před přehráním vidíte celý výřez, během poslechu se vodopád posouvá spolu se zvukem a zobrazuje posledních deset sekund. Pauza zastaví i obraz, posun ve zvuku posune i vodopád.
U nahrávek pro externí digitální dekodér výřez zatím chybí.

Live play
Po zapnutí Live play se každá nová dokončená nahrávka zařadí do fronty a přehraje. Nahrávky z více přijímačů se přehrávají jedna po druhé. Před každou si můžete nechat přečíst název přijímače a kanálu hlasem prohlížeče.
Nahrávka musí nejdřív skončit a dorazit na server, dashboard kontroluje novinky každých pět sekund, takže jde o přehrávání se zpožděním. Na telefonu může přehrávání na pozadí omezit prohlížeč.
Co nahrávat a co raději ne
GlobalScanRX nahrávky ukládá, nabízí ke stažení a umí je zpřístupnit dalším bastlířům na serveru. Pásma si proto vybírejte s rozmyslem a kmitočty, které nahrávat nechcete, rovnou zablokujte.
Na čem to běží
Provozuji to na starším počítači s Intel Core i3 (tuším třetí generace), na kterém běží Proxmox a v něm virtuální Linux, do kterého předávám USB přijímače. Příkon, vytížení ani denní objem nahrávek jsem zatím neměřil, výkonový strop tedy neznám.
Používám RTL-SDR Blog V3 a VHF/UHF anténu, takovou tu „bílou hůl“. Tři dongly mám na jedné anténě přes čínskou redukci ze tří SMA na jeden. Její RF parametry nemám změřené, jako vzor pro anténní rozvod ji tedy neberte.
Co budete potřebovat:
- linuxový počítač amd64 (Raspberry Pi a ARM zatím ověřené nemám)
- RTL-SDR dongle, pro začátek stačí jeden, třeba RTL-SDR Blog V3 s anténami
- anténu pro pásmo, které chcete poslouchat
- volné USB a místo na disku
- Docker Engine a Compose
Pokud s RTL-SDR začínáte, projděte si nejdřív návod RTL-SDR pro začátečníky, kde je i výběr donglu a antény.
Instalace
Obě části se instalují přes Docker, podrobný postup je v README serveru a klienta. Návody odkazují na poslední vydané balíčky, číslo verze tedy hádat nemusíte. Pokud vám server už někdo provozuje, začnete rovnou klientem.
Ve zkratce: na serveru nastavíte v .env adresu APP_URL, spustíte Docker Compose a v prvním formuláři vytvoříte administrátora. Tento krok dokončete dřív, než server pustíte do internetu.
Na počítači s dongly nastavíte SERVER_URL, skriptem prepare-usb.sh odstavíte DVB-T ovladač, který by si dongly jinak zabral, a klienta sestavíte. První build trvá i několik minut.
Po instalaci je potřeba přijímač přiřadit k účtu:
- V logu klienta najděte
RECEIVER CLAIM PIN. Log vypíšete ve složce klienta příkazemdocker compose logs -f --tail 100 receiver. - Na webu otevřete My Receivers → Claim, zadejte PIN, jméno a polohu přijímače.
- Administrátor přijímač aktivuje a vy nastavíte pásma jednotlivých SDR.
- Přijímač si přidejte na dashboard v Settings → Dashboard Settings. Platí to i pro administrátora, aktivace sama dashboard nenaplní (a pak koukáte do prázdné stránky).
Přepnutím na Public přijímač nabídnete ostatním bastlířům na serveru. Kdo chce jen poslouchat, vlastní SDR nepotřebuje.
Server aktualizujete skriptem scripts/update.sh, který před změnou udělá zálohu. Klient se sestavuje znovu ze zdrojového balíčku podle návodu na aktualizace. Obě části mají i volitelné automatické aktualizace, ve výchozím stavu vypnuté.
POZOR! Nepoužívejte docker compose down -v, pokud chcete zachovat data. U klienta byste přišli i o identitu přijímače a čekající nahrávky. Na zastavení stačí docker compose stop.
Co zatím zlobí
Nejvíc problémů dělá USB. Na jeden řadič doporučuji nejvýš tři aktivní SDR, při větším počtu mi řadič zamrzal. Různé zásuvky přitom často vedou do stejného řadiče. Někdy pomůže až dongle fyzicky odpojit a znovu připojit.
V Proxmoxu se mi občas ztratila celá trojice přijímačů. Podezírám větší datový tok, potvrzené to nemám. Bez virtualizace by to možná bylo lepší, srovnání ale zatím nemám. Když SDR nevidí ani lsusb v systému klienta, je chyba v USB nebo v systému a web s tím nesouvisí.
Digitál ještě ladím. Pro digitální hlas používám externí dekodér DSD a mám vyzkoušené DMR. Klient ale občas digitální vysílání zamění za analogové a uloží ho jako obyčejný zvuk místo předání dekodéru. Šifrovaný provoz samozřejmě nezpřístupní.
Vlastní demodulátor
Z vlastního demodulátoru mám největší radost. Nechtěl jsem, aby klient jen spouštěl rtl_fm a přebíral jeho výstup. Celé zpracování od I/Q vzorků po hotovou nahrávku jsem napsal v C++17, najdete ho v src/demodulator.cpp.
Klient nejdřív digitálně posune vybraný kanál do základního pásma a ořízne ho filtrem. Následuje demodulace AM nebo FM (NFM i WFM), decimace a převzorkování zvuku na 48 kHz. FM demodulátor počítá fázový rozdíl mezi po sobě jdoucími komplexními vzorky. V analogové větvi je dál DC block, volitelně AGC a ošetření návaznosti bloků dat, aby se na jejich hranicích nerozbíjela fáze ani časování.
Všechno od nuly samozřejmě nepíšu. S donglem komunikuji přes librtlsdr, FFT počítá FFTW. Vodopád vzniká z FFT, kterou scanner stejně počítá, zvukovou vlnu pro přehrávač připraví server přes FFmpeg. Server je napsaný v Laravelu a ve výchozím nastavení používá SQLite.
Kam dál
Nejdřív chci, aby skenování pokračovalo uvnitř přijímaného pásma i během nahrávání. Potom bych rád napsal vlastní DMR demodulátor a dekodéry CTCSS (podtóny pro ovládání squelche) a DTMF (tónová volba).
Dlouhodobě mě láká TDOA, tedy určení polohy vysílače z rozdílů času příchodu signálu na několik stanovišť. Z časových rozdílů vznikají hyperboly a z jejich průsečíku se dá určit, odkud signál přišel. Rád bych to jednou viděl přímo na mapě ve webu.
Časování chci srovnat přes společný referenční signál DAB. Klienti by střídali referenční a sledovaný kmitočet pomocí librtlsdr-2freq a posílali I/Q vzorky serveru ke korelaci. Stejnou metodu s RTL-SDR vyzkoušel DC9ST v projektu tdoa-evaluation-rtlsdr, první pokusy proto počítám taky v MATLABu. Kalibraci kmitočtu ověřím přes GSM BTS, polohu stanovišť určí USB GPS.
Jestli bude společná reference použitelná a co s časováním udělá přepínání tuneru, musím teprve ověřit. Přesnost 100 až 500 metrů je zatím jen můj cíl, naměřené výsledky nemám.
Radioamatérskou licenci zatím nemám, jednou bych si ji rád udělal. Do té doby poslouchám a zkouším, co se kolem rádia dá postavit.
Server je pod licencí GPLv3.








Žádné sociální komentáře k dispozici.