{"id":144,"date":"2023-08-12T23:00:02","date_gmt":"2023-08-12T22:00:02","guid":{"rendered":"https:\/\/www.tuxik.cz\/?p=144"},"modified":"2026-01-30T01:11:24","modified_gmt":"2026-01-30T00:11:24","slug":"radiodns-hybrid-radio","status":"publish","type":"post","link":"http:\/\/tuxik.cz\/?p=144","title":{"rendered":"RadioDNS &#8211; hybrid radio"},"content":{"rendered":"\n<p>U\u017e n\u011bjakou dobu provozujeme DAB multiplex nejmenovan\u00e9ho r\u00e1dia, a kdy\u017e jsem zaslechl o radiodns\/hybrid radio, hned jsem m\u011bl o \u010dem p\u0159em\u00fd\u0161let a studovat. Nen\u00ed to raketov\u00e1 v\u011bda, jde o opensource technologii a dokumentace <a rel=\"noreferrer noopener\" href=\"https:\/\/radiodns.org\/technical\/\" data-type=\"URL\" data-id=\"https:\/\/radiodns.org\/technical\/\" target=\"_blank\">existuje<\/a>. Po chv\u00edli studia dokumentace jsem se do toho pustil a n\u011bjak\u00e9 informace r\u00e1d p\u0159ed\u00e1m d\u00e1l. <br><br><strong><span style=\"text-decoration: underline;\">Co to vlastn\u011b je<\/span><\/strong><br><br>Hybrid radio\/radiodns kombinuje poslech standardn\u00edho r\u00e1dia p\u0159es FM nebo DAB, ve chv\u00edli kdy dojde k v\u00fdpadku sign\u00e1lu a radiop\u0159ij\u00edma\u010d to podporuje, pokus\u00ed se naj\u00edt alternativn\u00ed stream p\u0159es internet a pokra\u010dovat v poslechu. Jde o standard ( <a href=\"https:\/\/en.wikipedia.org\/wiki\/ETSI\">ETSI<\/a>&nbsp;TS 103 270 ), kter\u00fd podporuj\u00ed modern\u011bj\u0161\u00ed autor\u00e1dia.<br><br><strong><span style=\"text-decoration: underline;\">Jak to funguje<\/span><\/strong><\/p>\n\n\n\n<p>(Auto)r\u00e1dio dle frekvence\/DAB \u00fadaj\u016f zjist\u00ed URL, ze kter\u00e9 m\u016f\u017ee \u010derpat stream a dal\u0161\u00ed informace. A je to pom\u011brn\u011b trivi\u00e1ln\u00ed:<br><br>Z frekvence na FM a dal\u0161\u00edch \u00fadaj\u016f (RDS PI) se provede p\u0159eklad na DNS z\u00e1znam, nap\u0159\u00edklad takto:<br><br><em>09580.c479.ce2.fm.radiodns.org<\/em><br><br>Jak to provedl ? Tak si to rozeberme:<br><br>09580 je kmito\u010det &#8211; v tomto p\u0159\u00edpad\u011b 95,8MHz<br>c479 je RDS PI r\u00e1dia. Je unik\u00e1tn\u00ed v r\u00e1mci regul\u00e1tora (v p\u0159\u00edpad\u011b na\u0161\u00ed zem\u011b \u010cT\u00da) pro ka\u017edou radiostanici<br>ce2 je GCC &#8211; kombinace ECC ID (k\u00f3d zem\u011b, e2, viz. RDS standard t\u0159eba  http:\/\/poupa.cz\/rds\/countrycodes.htm ) a prvn\u00edho znaku RDS PI<br><br>Pozn\u00e1mka: Hodnota GCC je stejn\u00e1 pro FM i DAB v dan\u00e9 zemi, li\u0161\u00ed se pouze zp\u016fsob jej\u00edho z\u00edsk\u00e1n\u00ed (FM z RDS, DAB z FIG 0\/9).<br><\/p>\n\n\n\n<p>U <strong>DAB<\/strong> je to analogick\u00e9:<br><br><em>0.2fba.2007.2e2.dab.radiodns.org<\/em><\/p>\n\n\n\n<p>0 je service. Pokud neprovozujeme v\u00edc services, z\u016fstaneme u nuly a je to tak v po\u0159\u00e1dku.<br>2fba je ID DAB stanice. Op\u011bt p\u0159id\u011blen\u00e9 regul\u00e1torem<br>2007 je ensemble ID. P\u0159id\u011blen\u00e9 regul\u00e1torem a jedine\u010dn\u00e9 v r\u00e1mci jednoho muxu<br>2e2 je op\u011bt GCC. Kombinace ECC ID (e2) s ID DAB. Tady 2e2<\/p>\n\n\n\n<p>Pro <em>lenochy<\/em> jsem vytvo\u0159il jednoduchou kalkula\u010dku, sta\u010d\u00ed vyplnit ECC\/EID\/SID a m\u00e1te DNS z\u00e1znam pro radiodns.org \ud83d\ude42<\/p>\n\n\n\n<script type=\"text\/javascript\"> function dabpis(){ if(document.all.eid.value != \"\" && document.all.sid.value != \"\" && document.all.ecc.value != \"\"){ var gcc=document.all.sid.value.substring(0,1); var dabdnsval=document.all.scids.value+\".\"+document.all.sid.value+\".\"+document.all.eid.value+\".\"+gcc+document.all.ecc.value+\".dab.radiodns.org\"; document.getElementById(\"dabdns\").innerHTML=\"<i> \"+dabdnsval+\"<\/i>\"; } else { document.getElementById(\"dabdns\").innerHTML=\"<b>Vyplnte prosim<\/b>\"; } } function fmpis(){ if(document.all.fm_ecc.value != \"\" && document.all.fm_rds.value != \"\" && document.all.fm_freq.value != \"\"){ var fm_gcc = document.all.fm_rds.value.substring(0,1);\n var fmf=document.all.fm_freq.value; var fm_freq_=fmf.replace(\",\",\"\"); var fmf_l=document.all.fm_freq.value; if(fmf_l.length < 5){ fm_freq_=\"0\"+fm_freq_+\"0\"; } else { fm_freq_=fm_freq_+\"0\"; } var fmdnsval=fm_freq_+\".\"+document.all.fm_rds.value+\".\"+fm_gcc + document.all.fm_ecc.value+\".fm.radiodns.org\"; document.getElementById(\"fmdns\").innerHTML=\"<i> \"+fmdnsval+\"<\/i>\"; } else { document.getElementById(\"fmdns\").innerHTML=\"<b>Vyplnte prosim<\/b>\"; } } <\/script>\n\n<table border=\"0\"> <form> <tr><th>FM<\/th><\/tr> <tr><td>ECC:<\/td><td><input name=\"fm_ecc\" type=\"text\" \/> <tr><td>Frekvence:<\/div><\/td><td><input name=\"fm_freq\" type=\"text\" \/><\/td><\/tr> <tr><td>RDS PI:<\/td><td><input name=\"fm_rds\" type=\"text\" \/><\/td><\/tr> <tr><td><input type=\"button\" onclick=\"fmpis()\" value=\"Zjisti DNS\" \/><\/td><td><div id=\"fmdns\"> <\/div><\/td><\/tr> <\/form> <\/table> <table border=\"0\"> <form> <tr><th>DAB<\/th><\/tr> <tr><td>ECC:<\/td><td><input name=\"ecc\" id=\"f_ecc\" type=\"text\" \/> <tr><td><div id=\"eid_t\">Ensemble ID:<\/div><\/td><td><input name=\"eid\" id=\"f_eid\" type=\"text\" \/><\/td><\/tr> <tr><td>Service ID:<\/td><td><input name=\"sid\" id=\"f_sid\" type=\"text\" \/><\/td><\/tr> <tr><td>Service component ID:<\/td><td><input name=\"scids\" id=\"f_scid\" type=\"text\" value=\"0\" \/><\/td><\/tr> <tr><td><input type=\"button\" onclick=\"dabpis()\" value=\"Zjisti DNS\" \/><\/td><td><div id=\"dabdns\"> <\/div><\/td><\/tr> <\/form> <\/table>\n\n\n\n<p>T\u00edm zn\u00e1me DNS z\u00e1znam u radiodns.org a provedeme jeho p\u0159eklad:<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>;; QUESTION SECTION:\n;0.2f76.2001.2e2.dab.radiodns.org. IN\tA\n\n;; ANSWER SECTION:\n0.2f76.2001.2e2.dab.radiodns.org. 900 IN CNAME\tzunradio.cz.\nzunradio.cz.\t\t3600\tIN\tA\t217.198.114.120\n<\/code><\/pre>\n\n\n\n<p>N\u00e1sledn\u011b prob\u011bhne dotaz na DNS SRV z\u00e1znamy _radioepg._tcp.domena_dle_cname a _radiovis_tcp.domena_dle_cname, takto (p\u0159iklad z radia ZUN):<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tuxik~$ dig _radiovis._tcp.zunradio.cz srv\n\n; &lt;&lt;&gt;&gt; DiG 9.16.37-Debian &lt;&lt;&gt;&gt; _radiovis._tcp.zunradio.cz srv\n;; global options: +cmd\n;; Got answer:\n;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 42574\n;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 512\n;; QUESTION SECTION:\n;_radiovis._tcp.zunradio.cz. IN SRV\n\n;; ANSWER SECTION:\n_radiovis._tcp.zunradio.cz. 3600 IN SRV 0 100 61613 vis.zunradio.cz.\n\n;; Query time: 35 msec\n;; SERVER: 8.8.8.8#53(8.8.8.8)\n;; WHEN: Thu Aug 17 01:36:52 CEST 2023\n;; MSG SIZE rcvd: 90\n\ntuxik~$ dig _radioepg._tcp.zunradio.cz srv\n\n; &lt;&lt;&gt;&gt; DiG 9.16.37-Debian &lt;&lt;&gt;&gt; _radioepg._tcp.zunradio.cz srv\n;; global options: +cmd\n;; Got answer:\n;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 61135\n;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 512\n;; QUESTION SECTION:\n;_radioepg._tcp.zunradio.cz. IN SRV\n\n;; ANSWER SECTION:\n_radioepg._tcp.zunradio.cz. 3600 IN SRV 0 100 80 epg.zunradio.cz.\n\n;; Query time: 31 msec\n;; SERVER: 8.8.8.8#53(8.8.8.8)\n;; WHEN: Thu Aug 17 01:37:01 CEST 2023\n;; MSG SIZE rcvd: 90<\/code><\/pre>\n\n\n\n<p>Vida, servery m\u00e1me, tak zjist\u00edme SI (service information). Dle normy je vzdy na stejne URL, a to:<br><br><em>http:\/\/URL_DLE_DNS\/radiodns\/spi\/3.1\/SI.xml<\/em><br><br>V p\u0159\u00edpad\u011b r\u00e1dia ZUN:<br><a rel=\"noreferrer noopener\" href=\"http:\/\/epg.zunradio.cz\/radiodns\/spi\/3.1\/SI.xml\" target=\"_blank\">http:\/\/epg.zunradio.cz\/radiodns\/spi\/3.1\/SI.xml<\/a><\/p>\n\n\n\n<p>Provedeme tedy dotaz na tento soubor a voila, m\u00e1me co pot\u0159ebujeme. URL streamu a DAB frekvenci:<\/p>\n\n\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\"><div class=\"wp-block-group__inner-container\">\n<pre class=\"wp-block-code\"><code>&lt;bearer id=\"dab:2e2.2001.2f76.0\" cost=\"20\" mimeValue=\"audio\/aacp\" offset=\"2500\"\/&gt;\n&lt;bearer id=\"https:\/\/stream.zunradio.cz\/zun2.aac\" cost=\"70\" mimeValue=\"audio\/aacp\" bitrate=\"48\" offset=\"16000\"\/&gt;\n&lt;bearer id=\"https:\/\/stream.zunradio.cz\/zun1.aac\" cost=\"72\" mimeValue=\"audio\/aacp\" bitrate=\"128\" offset=\"16000\"\/&gt;\n&lt;radiodns fqdn=\"rdns.zunradio.cz\" serviceIdentifier=\"zunradio\"\/&gt;<\/code><\/pre>\n<\/div><\/div>\n\n\n\n<p>(Auto)r\u00e1dio u\u017e tedy v\u00ed, kam se spojit na stream, v\u00ed alternativn\u00ed DAB a FM frekvence a m\u011blo by to fungovat jak zam\u00fd\u0161l\u00ed norma. Cel\u00fd SI (service information) soubor je pom\u011brn\u011b dlouh\u00fd a slo\u017eit\u00fd, jsou v n\u011bm informace o logu stanice v r\u016fzn\u00fdch rozli\u0161en\u00edch, informace o stanici, alternativn\u00ed frekvence v DAB a FM, ale rozeb\u00edrat si ho nebudeme. Kdo chce, m\u016f\u017ee si jak inspiraci na\u010d\u00edst <a rel=\"noreferrer noopener\" href=\"http:\/\/epg.zunradio.cz\/radiodns\/spi\/3.1\/SI.xml\" target=\"_blank\">http:\/\/epg.zunradio.cz\/radiodns\/spi\/3.1\/SI.xml<\/a>  nebo <a rel=\"noreferrer noopener\" href=\"http:\/\/epg.radiosazava.cz\/radiodns\/spi\/3.1\/SI.xml\" target=\"_blank\">http:\/\/epg.radiosazava.cz\/radiodns\/spi\/3.1\/SI.xml<\/a> nebo slo\u017eit\u011bj\u0161\u00ed \u010cesk\u00fd Rozhlas <a rel=\"noreferrer noopener\" href=\"https:\/\/d2qydwcycui0ka.cloudfront.net\/b0d51624f9a7e63df994c2df9128f614250c2861aeb9f55a19146e9877b2201b.xml\" target=\"_blank\">https:\/\/d2qydwcycui0ka.cloudfront.net\/b0d51624f9a7e63df994c2df9128f614250c2861aeb9f55a19146e9877b2201b.xml<br><\/a>Mo\u017enost\u00ed je opravdu mnoho, v\u00edce viz. standard na webu<a href=\"http:\/\/radiodns.org\"> radiodns.org<\/a><br><br><strong><span style=\"text-decoration: underline;\">Jak r\u00e1dio zjist\u00ed n\u00e1zev hran\u00e9 p\u00edsni\u010dky a obr\u00e1zek coverart<\/span><\/strong><br><br>P\u0159es ji\u017e zmi\u0148ovan\u00fd radiovis. Vys\u00edl\u00e1 se URL obr\u00e1zku a text. Pro radiovis existuje n\u011bkolik r\u016fzn\u00fdch opensource program\u016f, my se zam\u011b\u0159\u00edme na <a href=\"https:\/\/github.com\/bbc\/node-radiovis-stomp-server\" data-type=\"URL\" data-id=\"https:\/\/github.com\/bbc\/node-radiovis-stomp-server\">radiovis-stomp-server<\/a> . Autorem je BBC, pro b\u011bh pot\u0159ebuje nodejs a ovl\u00e1d\u00e1 se p\u0159es curl. <\/p>\n\n\n\n<p>P\u0159edpokl\u00e1d\u00e1m, \u017ee \u010dlov\u011bk, kter\u00fd se do instalace pust\u00ed, m\u00e1 n\u011bjak\u00e9 znalosti Linuxu, tak\u017ee jen v bodech:<\/p>\n\n\n\n<p><code>git clone https:\/\/github.com\/bbc\/node-radiovis-stomp-server.git<br>cd node-radiovis-stomp-server\/<\/code><br><br>Poeditujeme services.json, abychom vys\u00edlali spr\u00e1vn\u00e9 \u00fadaje:<br><br><code>{<br>\"sazava\": {<br>\"name\": \"Radio Sazava\",<br>\"default_image\": \"http:\/\/radiosazava.cz\/image\/freestyle\/sazava_logo_www.png\",<br>\"default_link\": \"http:\/\/www.radiosazava.cz\",<br>\"bearers\": [ \"dab:2e2.2007.2fba.0\" ]<br>}<br>}<\/code><\/p>\n\n\n\n<p>No a spust\u00edme:<br><code>node .\/bin\/radiovis-stomp-server<br><\/code><br>Pro seriozn\u011bj\u0161\u00ed provoz doporu\u010duji spou\u0161t\u011bn\u00ed pod supervisor nebo jako systemd unitu (nebo ve screen a bash while smy\u010dce, co je komu po libosti&#8230;). <br><br>Radiovis n\u00e1m b\u011b\u017e\u00ed, tak do n\u011bj opatrn\u011b zkus\u00edme poslat n\u011bjak\u00e1 data.<br><br><code>curl http:\/\/localhost:3000\/services\/sazava -d 'image=http:\/\/nejaka_url_s_obrazkem_pisnicky\/image.jpg' -d \"text=nazev_pisnicky\"<\/code><\/p>\n\n\n\n<p>Radiovis n\u00e1m vr\u00e1t\u00ed &#8222;Content Published&#8220; a odvys\u00edl\u00e1 ve STOMP obsah.<br><br>Pro lad\u011bn\u00ed existuje op\u011bt od BBC <a href=\"https:\/\/github.com\/bbc\/RadioVisDemo\" data-type=\"link\" data-id=\"https:\/\/github.com\/bbc\/RadioVisDemo\">radiovisdemo<\/a> , sta\u010d\u00ed upravit soubory v adres\u00e1\u0159\u00ed conf a m\u016f\u017eete testovat i bez registrace na radiodns.org. <br><br><img decoding=\"async\" loading=\"lazy\" width=\"996\" height=\"704\" class=\"wp-image-179\" style=\"width: 600px;\" src=\"https:\/\/www.tuxik.cz\/wp-content\/uploads\/Snimek-obrazovky_2023-08-17_01-55-55.png\" alt=\"\" srcset=\"http:\/\/tuxik.cz\/wp-content\/uploads\/Snimek-obrazovky_2023-08-17_01-55-55.png 996w, http:\/\/tuxik.cz\/wp-content\/uploads\/Snimek-obrazovky_2023-08-17_01-55-55-300x212.png 300w, http:\/\/tuxik.cz\/wp-content\/uploads\/Snimek-obrazovky_2023-08-17_01-55-55-768x543.png 768w\" sizes=\"(max-width: 996px) 100vw, 996px\" \/><\/p>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Chci to implementovat do vlastn\u00edho r\u00e1dia, co d\u00e1l ?<\/span><\/strong><br><br>Pokud existuj\u00ed korektn\u00ed SRV z\u00e1znamy v DNS, existuje SI (service information) XML soubor a b\u011b\u017e\u00ed VIS server, u\u017e zb\u00fdv\u00e1 jen posledn\u00ed krok &#8211; poslat \u017e\u00e1dost o registraci radiodns.org dom\u00e9ny. M\u016f\u017ee vypadat t\u0159eba takhle:<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hello,\n\nwe want to use radiodns for our radio, details are below:\n\n_radiovis._tcp.rdns.radiosazava.cz. 820 IN\tSRV\t0 100 61613 vis.radiosazava.cz.\n_radioepg._tcp.rdns.radiosazava.cz. 499 IN\tSRV\t0 100 80 epg.radiosazava.cz.\n\nName and phone number: XXX YYY, +420123456789\n\nRadio name: OUR RADIO\n\nLicence authority: \u010cesk\u00fd telekomunika\u010dn\u00ed \u00fa\u0159ad (www.ctu.cz)\n\nZone and SI file is attached.\n\nThanks,\n\nRegards,<\/code><\/pre>\n\n\n\n<p>Jako p\u0159\u00edlohu nezapome\u0148te doplnit SI soubor a z\u00f3nov\u00fd soubor DNS. E-mail posilejte na registrations@radiodns.org, odpov\u00ed obvykle do 24 hodin.<br><br>Pokud n\u011bkomu text pomohl, dejte v\u011bd\u011bt do koment\u00e1\u0159\u016f, pokud si s n\u011b\u010d\u00edm nev\u00edte rady, ptejte se. R\u00e1d odpov\u00edm. A d\u00edky za p\u0159e\u010dten\u00ed !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>U\u017e n\u011bjakou dobu provozujeme DAB multiplex nejmenovan\u00e9ho r\u00e1dia, a kdy\u017e jsem zaslechl o radiodns\/hybrid radio, hned jsem m\u011bl o \u010dem p\u0159em\u00fd\u0161let a studovat. Nen\u00ed to raketov\u00e1 v\u011bda, jde o opensource technologii a dokumentace existuje. Po chv\u00edli studia dokumentace jsem se &hellip; <a href=\"http:\/\/tuxik.cz\/?p=144\">Cel\u00fd p\u0159\u00edsp\u011bvek <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,18],"tags":[],"_links":{"self":[{"href":"http:\/\/tuxik.cz\/index.php?rest_route=\/wp\/v2\/posts\/144"}],"collection":[{"href":"http:\/\/tuxik.cz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/tuxik.cz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/tuxik.cz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/tuxik.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=144"}],"version-history":[{"count":94,"href":"http:\/\/tuxik.cz\/index.php?rest_route=\/wp\/v2\/posts\/144\/revisions"}],"predecessor-version":[{"id":397,"href":"http:\/\/tuxik.cz\/index.php?rest_route=\/wp\/v2\/posts\/144\/revisions\/397"}],"wp:attachment":[{"href":"http:\/\/tuxik.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/tuxik.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=144"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/tuxik.cz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}