samedi 9 avril 2016

RTL-SDR SigInt

Lors du FOSDEM 2016, Felix Wunsch a présenté le SigInt comme une activité ludique et enrichissante... Équipé d'un de ces gadgets à moins de 10 euros sur eBay, une clé TNT avec un chip Realtek RTL2832U, je m'en vais faire un tour avec le LiveDVD GNU Radio sur la bande ISM 433 MHz :
Tiens!, il y a un joli signal assez puissant et bien stable... En fait, ce n'est pas tout le temps mais quand le signal est présent, il reste stable longtemps. Tout porte à croire qu'il s'agit de la télécommande de la grue du chantier en face... (les horaires et l'activité coïncident avec la présence du signal)
Comme on peut le voir sur l'affichage I/Q de la copie d'écran GNU Radio, ce n'est pas une modulation d'amplitude, la trace est un cercle (d'amplitude constante). En y regardant de plus près, en utilisant la commande
$ rtl_sdr -f 433630000 -s 256000 file
et d'un petit programme 'rtl_dump -p' pour sortir la phase en texte, on obtient avec Gnuplot quelque chose comme :
Le gain automatique (AGC) fait varier la puissance du signal qui sature un peu à l'extérieur mais bon. Ce qui est amusant, c'est que la phase semble 'tourner' (à magnitude constante). En fait, c'est dû au fait que la fréquence de réception choisie ne correspond pas exactement à la fréquence d'émission (en charabia : 'frequency offset' -> 'spinning constellation' en démodulation QAM). J'ai estimé la fréquence en regardant le 'waterfall'; ce n'est pas assez précis. Il existe des techniques pour retrouver la fréquence correcte mais on verra ça plus tard... Pour le moment, c'est bon assez pour voir si on peut en tirer quelque chose. Si l'on s'intéresse à l'évolution de la phase, on obtient bien quelque chose de structuré :
En zoomant,
on voit que le signal est très propre mais que les sauts autour de 0-360° rendent l'interprétation difficile. En assurant la continuité et en laissant croître la phase au delà de 360°, cela devient plus clair :
Cette dérive vers le haut est un peu gênante, on peut la supprimer artificiellement en soustrayant la pente (-i*alpha):
Et voilà une jolie trame bien propre (mais un peu asymétrique) qu'il ne reste plus qu'à analyser...

Si j'écris un petit programme qui mesure les montées et les descentes des données (montantes), j'obtiens quatre nuages de points bien séparés représentant les montées/descentes courtes/longues :
On notera également que l'on n'a pas n'importe quelle suite de transitions. On n'a pas de suite {courte descente+longue montée} ni de suite {courte montée+longue descente}. En fait, si on considère 4 positions de hauts et bas de courbe, on peut avoir les transitions 1->{2|4}, 2->1, 3->4 et 4->{3|1}. Seuls les départs de 1 et 4 permettent de coder 1 bits. Une petite transition est d'office suivie d'une petite transition qui ramène l'état à son point de départ. Une difficulté de ce petit programme est de commencer et finir aux bons endroits et éviter les parasites.

On peut déjà regarder si les trames se ressemblent en les mettant côte à côte :


Normalement, il faudrait filtrer pour purifier le signal, utiliser la fréquence correcte et ensuite synchroniser et corréler pour extraire les bits. Mais le signal est propre et semble facile à décoder avec un petit programme ad hoc. Mettons qu'on imprime '1' pour deux 'petites' transitions successives et '0' pour une grande transition. Les dix premières trames donnent :
111111000000000000000000010111010010000000011011011101100010101010101100000010010000000010000000010000000010000000010000000010000000010000111010001111100001011101110100010000000001111
0011000000000000000000010111010010000000011011011101100010101010110010000010010000000010000000010000000010000000010000000010000000011001001010001000100001011101110100010000000001111
111110001000000000000000000010111010010000000011011011101100010101010110100000010010000000010000000010000000010000000010000000010000000010001001101010111010001011101110100010000000001111
1110001000000000000000000010111010010000000011011011101100010101010111010000010010000000010000000010000000010000000010000000010000000011001100100111111010001011101110100010000000001111
111111011000000000000000000010111010010000000011011011101100010101010111100000010010000000010000000010000000010000000010000000010000000010001100011100000100001011101110100010000000001111
1111111011000000000000000000010111010010000000011011011101100010101010000010000010010000000010000000010000000010000000010000000010000000011010100100111001100001011101110100010000000001111
11111101011000000000000000000010111010010000000011011011101100010101010000100000010010000000010000000010000000010000000010000000010000000010010100011100110010001011101110100010000000001111
11111111110001000000000000000000010111010010000000011011011101100010101010001010000010010000000010000000010000000010000000010000000010000000011010001010001110010001011101110100010000000001111
01000000000000000000010111010010000000011011011101100010101010001100000010010000000010000000010000000010000000010000000010000000010010001101010001100001011101110100010000000001111
011000000000000000000010111010010000000011011011101100010101010010010000010010000000010000000010000000010000000010000000010000000011011111101010110100001011101110100010000000001111
C'est amusant, des similarités apparaissent mais, pour une raison inconnue, elles ne sont pas alignées. Si on les aligne, cela donne :
000000000000000000010111010010000000011011011101100010101010101100000010010000000010000000010000000010000000010000000010000000010000111010001111100001011101110100010000000001111
000000000000000000010111010010000000011011011101100010101010110010000010010000000010000000010000000010000000010000000010000000011001001010001000100001011101110100010000000001111
000000000000000000010111010010000000011011011101100010101010110100000010010000000010000000010000000010000000010000000010000000010001001101010111010001011101110100010000000001111
000000000000000000010111010010000000011011011101100010101010111010000010010000000010000000010000000010000000010000000010000000011001100100111111010001011101110100010000000001111
000000000000000000010111010010000000011011011101100010101010111100000010010000000010000000010000000010000000010000000010000000010001100011100000100001011101110100010000000001111
000000000000000000010111010010000000011011011101100010101010000010000010010000000010000000010000000010000000010000000010000000011010100100111001100001011101110100010000000001111
000000000000000000010111010010000000011011011101100010101010000100000010010000000010000000010000000010000000010000000010000000010010100011100110010001011101110100010000000001111
000000000000000000010111010010000000011011011101100010101010001010000010010000000010000000010000000010000000010000000010000000011010001010001110010001011101110100010000000001111
000000000000000000010111010010000000011011011101100010101010001100000010010000000010000000010000000010000000010000000010000000010010001101010001100001011101110100010000000001111
000000000000000000010111010010000000011011011101100010101010010010000010010000000010000000010000000010000000010000000010000000011011111101010110100001011101110100010000000001111
En hexadécimal, cela pourrait donner quelque chose comme (dc; 16o2i ...p; 'pourrait' parce qu'il faut encore aligner et voir si c'est le LSB ou le MSB qui est transmit en premier) :
02E900DBB155604804020100804021D1F0BBA200F
02E900DBB1559048040201008040325110BBA200F
02E900DBB155A048040201008040226AE8BBA200F
02E900DBB155D0480402010080403327E8BBA200F
02E900DBB155E048040201008040231C10BBA200F
02E900DBB1541048040201008040352730BBA200F
02E900DBB1542048040201008040251CC8BBA200F
02E900DBB15450480402010080403451C8BBA200F
02E900DBB1546048040201008040246A30BBA200F
02E900DBB154904804020100804037EAD0BBA200F
On trouve des choses constantes et d'autres qui ne le sont pas. Probablement qu'en analysant un grand nombre de trames dans un grand nombres de circonstances on parviendrait à décoder tout cela. Et, en comparant différentes grues, y découvrir une adresse, un modèle,... (?)

Les tests du billet suivant laissent à penser qu'il pourrait s'agir d'un encodage Manchester en GFSK à 9600 bauds (?; le CC1101 ne semble pas pouvoir du Manchester en MSK (qui 'arrondit' mieux l'évolution de la phase)).

(à suivre?)