Už nějakou dobu provozujeme DAB multiplex nejmenovaného rádia, a když jsem zaslechl o radiodns/hybrid radio, hned jsem měl o čem přemýšlet a studovat. Není to raketová věda, jde o opensource technologii a dokumentace existuje. Po chvíli studia dokumentace jsem se do toho pustil a nějaké informace rád předám dál.
Co to vlastně je
Hybrid radio/radiodns kombinuje poslech standardního rádia přes FM nebo DAB, ve chvíli kdy dojde k výpadku signálu a radiopřijímač to podporuje, pokusí se najít alternativní stream přes internet a pokračovat v poslechu. Jde o standard ( ETSI TS 103 270 ), který podporují modernější autorádia.
Jak to funguje
(Auto)rádio dle frekvence/DAB údajů zjistí URL, ze které může čerpat stream a další informace. A je to poměrně triviální:
Z frekvence na FM a dalších údajů (RDS PI) se provede překlad na DNS záznam, například takto:
09580.c479.ce1.fm.radiodns.org
Jak to provedl ? Tak si to rozeberme:
09580 je kmitočet – v tomto případě 95,8MHz
c479 je RDS PI rádia. Je unikátní v rámci regulátora (v případě naší země ČTÚ) pro každou radiostanici
ce1 je GCC – kombinace ECC ID (kód země, e1, viz. RDS standard třeba http://poupa.cz/rds/countrycodes.htm ) a prvního znaku RDS PI
U DAB je to analogické:
0.2fba.2007.2e2.dab.radiodns.org
0 je service. Pokud neprovozujeme víc services, zůstaneme u nuly a je to tak v pořádku.
2fba je ID DAB stanice. Opět přidělené regulátorem
2007 je ensemble ID. Přidělené regulátorem a jedinečné v rámci jednoho muxu
2e2 je opět GCC. Kombinace ECC ID (e2) s ID DAB. Tady 2e2
Pro lenochy jsem vytvořil jednoduchou kalkulačku, stačí vyplnit ECC/EID/SID a máte DNS záznam pro radiodns.org 🙂
Tím známe DNS záznam u radiodns.org a provedeme jeho překlad:
;; QUESTION SECTION:
;0.2f76.2001.2e2.dab.radiodns.org. IN A
;; ANSWER SECTION:
0.2f76.2001.2e2.dab.radiodns.org. 900 IN CNAME zunradio.cz.
zunradio.cz. 3600 IN A 217.198.114.120
Následně proběhne dotaz na DNS SRV záznamy _radioepg._tcp.domena_dle_cname a _radiovis_tcp.domena_dle_cname, takto (přiklad z radia ZUN):
tuxik~$ dig _radiovis._tcp.zunradio.cz srv
; <<>> DiG 9.16.37-Debian <<>> _radiovis._tcp.zunradio.cz srv
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42574
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_radiovis._tcp.zunradio.cz. IN SRV
;; ANSWER SECTION:
_radiovis._tcp.zunradio.cz. 3600 IN SRV 0 100 61613 vis.zunradio.cz.
;; Query time: 35 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu Aug 17 01:36:52 CEST 2023
;; MSG SIZE rcvd: 90
tuxik~$ dig _radioepg._tcp.zunradio.cz srv
; <<>> DiG 9.16.37-Debian <<>> _radioepg._tcp.zunradio.cz srv
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61135
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_radioepg._tcp.zunradio.cz. IN SRV
;; ANSWER SECTION:
_radioepg._tcp.zunradio.cz. 3600 IN SRV 0 100 80 epg.zunradio.cz.
;; Query time: 31 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu Aug 17 01:37:01 CEST 2023
;; MSG SIZE rcvd: 90
Vida, servery máme, tak zjistíme SI (service information). Dle normy je vzdy na stejne URL, a to:
http://URL_DLE_DNS/radiodns/spi/3.1/SI.xml
V případě rádia ZUN:
http://epg.zunradio.cz/radiodns/spi/3.1/SI.xml
Provedeme tedy dotaz na tento soubor a voila, máme co potřebujeme. URL streamu a DAB frekvenci:
<bearer id="dab:2e2.2001.2f76.0" cost="20" mimeValue="audio/aacp" offset="2500"/>
<bearer id="https://stream.zunradio.cz/zun2.aac" cost="70" mimeValue="audio/aacp" bitrate="48" offset="16000"/>
<bearer id="https://stream.zunradio.cz/zun1.aac" cost="72" mimeValue="audio/aacp" bitrate="128" offset="16000"/>
<radiodns fqdn="rdns.zunradio.cz" serviceIdentifier="zunradio"/>
(Auto)rádio už tedy ví, kam se spojit na stream, ví alternativní DAB a FM frekvence a mělo by to fungovat jak zamýšlí norma. Celý SI (service information) soubor je poměrně dlouhý a složitý, jsou v něm informace o logu stanice v různých rozlišeních, informace o stanici, alternativní frekvence v DAB a FM, ale rozebírat si ho nebudeme. Kdo chce, může si jak inspiraci načíst http://epg.zunradio.cz/radiodns/spi/3.1/SI.xml nebo http://epg.radiosazava.cz/radiodns/spi/3.1/SI.xml nebo složitější Český Rozhlas https://d2qydwcycui0ka.cloudfront.net/b0d51624f9a7e63df994c2df9128f614250c2861aeb9f55a19146e9877b2201b.xml
Možností je opravdu mnoho, více viz. standard na webu radiodns.org
Jak rádio zjistí název hrané písničky a obrázek coverart
Přes již zmiňovaný radiovis. Vysílá se URL obrázku a text. Pro radiovis existuje několik různých opensource programů, my se zaměříme na radiovis-stomp-server . Autorem je BBC, pro běh potřebuje nodejs a ovládá se přes curl.
Předpokládám, že člověk, který se do instalace pustí, má nějaké znalosti Linuxu, takže jen v bodech:
git clone https://github.com/bbc/node-radiovis-stomp-server.git
cd node-radiovis-stomp-server/
Poeditujeme services.json, abychom vysílali správné údaje:
{
"sazava": {
"name": "Radio Sazava",
"default_image": "http://radiosazava.cz/image/freestyle/sazava_logo_www.png",
"default_link": "http://www.radiosazava.cz",
"bearers": [ "dab:2e2.2007.2fba.0" ]
}
}
No a spustíme:
node ./bin/radiovis-stomp-server
Pro serioznější provoz doporučuji spouštění pod supervisor nebo jako systemd unitu (nebo ve screen a bash while smyčce, co je komu po libosti…).
Radiovis nám běží, tak do něj opatrně zkusíme poslat nějaká data.
curl http://localhost:3000/services/sazava -d 'image=http://nejaka_url_s_obrazkem_pisnicky/image.jpg' -d "text=nazev_pisnicky"
Radiovis nám vrátí „Content Published“ a odvysílá ve STOMP obsah.
Pro ladění existuje opět od BBC radiovisdemo , stačí upravit soubory v adresáří conf a můžete testovat i bez registrace na radiodns.org.
Chci to implementovat do vlastního rádia, co dál ?
Pokud existují korektní SRV záznamy v DNS, existuje SI (service information) XML soubor a běží VIS server, už zbývá jen poslední krok – poslat žádost o registraci radiodns.org domény. Může vypadat třeba takhle:
Hello,
we want to use radiodns for our radio, details are below:
_radiovis._tcp.rdns.radiosazava.cz. 820 IN SRV 0 100 61613 vis.radiosazava.cz.
_radioepg._tcp.rdns.radiosazava.cz. 499 IN SRV 0 100 80 epg.radiosazava.cz.
Name and phone number: XXX YYY, +420123456789
Radio name: OUR RADIO
Licence authority: Český telekomunikační úřad (www.ctu.cz)
Zone and SI file is attached.
Thanks,
Regards,
Jako přílohu nezapomeňte doplnit SI soubor a zónový soubor DNS. E-mail posilejte na registrations@radiodns.org, odpoví obvykle do 24 hodin.
Pokud někomu text pomohl, dejte vědět do komentářů, pokud si s něčím nevíte rady, ptejte se. Rád odpovím. A díky za přečtení !