Décoder les messages RDS en ligne de commandes avec un récepteur RTL-SDR

Suite à ce billet de Oona Räisänen sur son blog j’ai tenté de faire fonctionner son sympathique outil Redsea.

Récupération de Liquid-dsp depuis un fork disposant des éléments pour produire un paquet Debian (./configure && make && sudo make install, je fais pas, c’est un appeau à problème pour plus tard) , puis clonage du dépôt officiel pour y inclure le répertoire debian :

% git clone https://github.com/dsx/liquid-dsp.git
% mv liquid-dsp liquid-dsp.DEB
% cd liquid-dsp.DEB
% git checkout debianize
% cd ..
% git clone https://github.com/jgaeddert/liquid-dsp.git
% cd liquid-dsp
% cp -r ../liquid-dsp.DEB/debian .
% dpkg-buildpackage -b
% cd ..
% sudo dpkg -i liquid-dsp_1.2.0-git-1_i386.deb

Ok, on a Liquid-dsp d’installé bien proprement. On passe à Redsea :

% git clone https://github.com/windytan/redsea.git
% cd redsea
% ./autogen.sh
% ./configure
% make
[...]
subcarrier.cc: In member function ‘void redsea::Subcarrier::demodulateMoreBits()’:
subcarrier.cc:171:9: error: ‘tie’ is not a member of ‘std’
 std::tie(is_clock,biphase) = biphase_decoder_.push(symbol);
 ^~~

Oh !?

Ok, on édite src/subcarrier.cc et on ajoute #include <tuple> en début de fichier (étrange que ça marche pour d’autres utilisateurs), et là la compilation se passe sans problème. On peut jouer :

% ./rtl-rx.sh -f 89M | jq -c
Found 1 device(s):
 0: Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Detached kernel driver
Found Rafael Micro R820T tuner
Tuner gain set to 40.20 dB.
Tuned to 89342000 Hz.
Oversampling input by: 8x.
Oversampling output by: 1x.
Buffer size: 5.99ms
Exact sample rate is: 1368000.013046 Hz
Sampling at 1368000 S/s.
Output at 171000 Hz.
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"partial_ps":" F "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"alt_freqs":[89,91.9,93.3],"partial_ps":" FM "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"partial_ps":"AZ "}
{"pi":"0xf784","group":"2A","tp":true,"prog_type":"No PTY","partial_radiotext":" M.CO"}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"alt_freqs":[89,91.9,93.3],"partial_ps":"AZUR "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"partial_ps":"AZUR F "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"alt_freqs":[89,91.9,93.3],"ps":"AZUR FM "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"partial_ps":"AZ "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"alt_freqs":[89,91.9,93.3],"partial_ps":"AZUR "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"partial_ps":"AZUR F "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"alt_freqs":[89,91.9,93.3],"ps":"AZUR FM "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"partial_ps":"AZ "}
{"pi":"0xf784","group":"2A","tp":true,"prog_type":"No PTY","partial_radiotext":" M.COM"}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"alt_freqs":[89,91.9,93.3],"partial_ps":"AZUR "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"partial_ps":"AZUR F "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"alt_freqs":[89,91.9,93.3],"ps":"AZUR FM "}
{"pi":"0xf784","group":"0A","tp":true,"prog_type":"No PTY","ta":false,"is_music":true,"partial_ps":"AZ "}
^CSignal caught, exiting!
User cancel, exiting...
Reattached kernel driver
Signal caught, exiting!

jq s’installe avec le paquet du même nom, c’est un colorisateur syntaxique JSON.

USB HID Report Descriptor

Le nouveau support USB Gadget du noyau permet de facilement composer des périphériques USB via configfs et ceci inclus les périphériques USB HID.

Il faut cependant écrire le descripteur de rapport dans un fichier report_desc, par exemple depuis un script bash et la commande echo.

On peut facilement récupérer cette information depuis un périphérique HID existant (celui qu’on veut simuler) avec lsusb -v, mais le format n’est pas directement utilisable.

Si, en revanche on utilise usbhid-dump livré avec les usbutils, on obtient un format plus facile à gérer :

% sudo usbhid-dump -d 1d34:0004
001:106:000:DESCRIPTOR 1474883599.550267
 05 01 09 10 A1 01 05 00 19 10 29 11 15 00 25 0F
 75 08 95 08 91 02 19 10 29 11 15 00 25 0F 75 08
 95 08 81 00 C0

Avec quelques coups de grep et de sed, on peut transformer cela en quelque chose de directement utilisable avec un script :

% sudo usbhid-dump -d 1d34:0004 | grep "^ " | sed ':a;N;$!ba;s/\n//g;s/ /\\x/g' 
\x05\x01\x09\x10\xA1\x01\x05\x00\x19\x10\x29\x11\x15\x00\x25\x0F\x75\x08\x95\x08\x91\x02\x19\x10\x29\x11\x15\x00\x25\x0F\x75\x08\x95\x08\x81\x00\xC0

Et pour la taille du descripteur :

% sudo usbhid-dump -d 1d34:0004 | grep "^ " | sed ':a;N;$!ba;s/\n//g;s/ /\\x/g' | grep -Fo x | wc -l
37

PS : Oui, ce billet est surtout un mémo mais cela pourra peut-être faire économiser 5mn à quelqu’un d’autre ;)

Sa tablette Android comme périphérique de pointage, ou comment j’ai économisé 200€

Si vous êtes amateurs d’outils comme Gimp et Inkscape vous le savez, travailler avec la souri c’est comme dessiner avec une pomme de terre. Lorsqu’on veut de la précision, l’idéal c’est une tablette graphique, type Wacom.

Après quelques minutes de recherche j’étais sur le point de me décider pour un petit tour à la Fnac du coin (oui je sais, la Fnac, ses vendeurs comiques et leur conseils amusant, mais généralement quand je craque pour un matériel, je le veux de suite, pas 48h plus tard). Mon dévolu se serait jeté sur une Wacom Intuos Pen & Touch Medium à quelques 200€, compatible GNU/Linux.

Et c’est à ce moment précis qu’une question m’est venue : « oh ! 2s ! J’ai une Nvidia Schield qui a presque une taille A5 et un stylet. Ne serait-ce pas possible d’en faire un périphérique de pointage ?« . Et la réponse est OUI ! Sous GNU/Linux, avec des outils open source et sans toucher à la configuration en plus ! Lire la suite