Analyser des signaux 433 MHz avec le BladeRF

15 février 2026 dans Embedded par Gerboise5 minutes

Capturer et décoder des signaux de télécommande domotique à 433 MHz avec des outils de SDR

Introduction

La plupart des télécommandes domotiques émettent dans la bande ISM à 433,92 MHz, une fréquence libre d’utilisation très répandue pour les appareils sans fil à courte portée. Ces télécommandes utilisent généralement l’On-Off Keying (OOK), une forme simple d’Amplitude Shift Keying (ASK) où la porteuse est soit émise soit coupée pour représenter des 1 et des 0 binaires.

Dans cet article, on utilise le BladeRF xA4 pour capturer le signal d’une télécommande domotique, le visualiser dans GQRX, et décoder les données transmises. C’est un bon exercice pour comprendre le fonctionnement des communications RF au niveau de la couche physique.

Prérequis :

  • Un BladeRF xA4 avec firmware et FPGA chargés (voir Débuter avec le BladeRF)
  • GQRX installé et configuré avec SoapyBladeRF
  • Une télécommande 433 MHz à analyser

Observations

Observation sur le waterfall

En réglant GQRX sur 433,92 MHz et en appuyant sur le bouton de la télécommande, on observe le signal sur le waterfall. Chaque appui produit une série de courtes impulsions à une fréquence fixe. La porteuse apparaît et disparaît brusquement, ce qui est caractéristique de la modulation OOK : l’émetteur est soit totalement actif, soit totalement inactif, sans déviation de fréquence.

Capture waterfall d’un signal de télécommande domotique à 433 MHz

Analyse spectrale

La vue spectrale (partie supérieure de GQRX) confirme la modulation OOK. Quand on appuie sur le bouton, un pic net apparaît à 433,92 MHz, bien au-dessus du bruit de fond. Quand on relâche, le pic disparaît complètement. Pas de déviation de fréquence, uniquement un motif on/off : c’est bien de l’OOK et non de la FSK.

Analyse spectrale du signal de télécommande domotique

Décodage avec rtl_433

Pour aller plus loin, on utilise rtl_433 en mode analyse pour détecter automatiquement la modulation et décoder le signal :

rtl_433 -d soapy=0,driver=bladerf -f 433920000 -g 60 -A -S 2M

Sortie :

*** Saving signal to file g009_433.92M_250k.cs16 (232505 samples, 1048576 bytes)
Detected OOK package
Analyzing pulses...
Total count:   54,  width: 1141.52 ms		(285380 S)
Pulse width distribution:
 [ 0] count:    1,  width: 38912 us [38912;38912]	(9728 S)
 [ 1] count:   29,  width: 13092 us [13064;13172]	(3273 S)
 [ 2] count:   23,  width: 6592 us [6556;6620]	(1648 S)
 [ 3] count:    1,  width:    0 us [0;0]	(   0 S)
Gap width distribution:
 [ 0] count:   29,  width: 6536 us [6500;6580]	(1634 S)
 [ 1] count:   23,  width: 13048 us [13024;13100]	(3262 S)
 [ 2] count:    1,  width: 81476 us [81476;81476]	(20369 S)

Level estimates [high, low]:  12508,   5446
RSSI: -2.3 dB SNR: 7.2 dB Noise: -9.6 dB
Frequency offsets [F1, F2]:   -1302,      0	(-5.0 kHz, +0.0 kHz)
Guessing modulation: Pulse Width Modulation with sync/delimiter
Attempting demodulation... short_width: 6592, long_width: 13092, reset_limit: 81480, sync_width: 38912
Use a flex decoder with -X 'n=name,m=OOK_PWM,s=6592,l=13092,r=81480,g=0,t=0,y=38912'
codes     : {52}[REDACTED]

rtl_433 confirme la modulation OOK avec encodage Pulse Width Modulation (PWM). L’analyse révèle deux largeurs d’impulsion distinctes (~6,6 ms et ~13 ms) représentant les 0 et 1 binaires, avec un délimiteur de synchronisation de ~39 ms marquant le début de chaque trame.

Analyse en lot des signaux capturés

Avec le flag -S 2M, rtl_433 sauvegarde chaque signal détecté dans un fichier .cs16 (échantillons IQ complexes signés 16 bits). Les fichiers sont numérotés séquentiellement (g001, g002, …, g118), préservant l’ordre chronologique de capture :

g001_433.92M_250k.cs16  g002_433.92M_250k.cs16  ...  g118_433.92M_250k.cs16

On peut rejouer tous les fichiers capturés et compter les occurrences de chaque trame décodée :

for f in *.cs16; do rtl_433 -r "$f" -A 2>/dev/null; done \
  | grep "^codes" | sort | uniq -c | sort -rn
     17 codes     : {52}[REDACTED]
     13 codes     : {52}[REDACTED]
     13 codes     : {52}[REDACTED]
     11 codes     : {52}[REDACTED]
      9 codes     : {52}[REDACTED]
      3 codes     : {63}[REDACTED]
      2 codes     : {62}[REDACTED]
      2 codes     : {61}[REDACTED]
      1 codes     : {63}[REDACTED]
      1 codes     : {63}[REDACTED]
      1 codes     : {62}[REDACTED]
      1 codes     : {61}[REDACTED]
      1 codes     : {52}[REDACTED]
      1 codes     : {52}[REDACTED]
      1 codes     : {26}[REDACTED]
      1 codes     : {24}[REDACTED]

L’analyse révèle plusieurs motifs :

  • 5 codes distincts de 52 bits apparaissent de manière régulière : ils correspondent aux 5 boutons de la télécommande. Ce sont les trames valides et complètes.
  • Les codes plus courts (24-26 bits) sont des captures tronquées, où rtl_433 a raté le début ou la fin de la transmission.
  • Les codes plus longs (61-63 bits) sont dus au bruit ou à des erreurs de timing qui ont ajouté des bits parasites.

Comme les fichiers sont classés chronologiquement, on peut extraire uniquement les codes valides de 52 bits dans l’ordre de capture et supprimer les doublons consécutifs :

for f in $(ls -1 *.cs16 | sort); do rtl_433 -r "$f" -A 2>/dev/null | grep "^codes.*{52}"; done | awk '!seen[$0]++'

C’est normal d’avoir des doublons : les télécommandes RF répètent volontairement la même trame plusieurs fois par appui pour améliorer la fiabilité, car chaque transmission individuelle peut être corrompue par du bruit. En filtrant les doublons avec awk, on ne garde qu’un code par appui de bouton, ce qui révèle la séquence réelle des boutons pressés pendant la session de capture.

Cette analyse montre que cette télécommande utilise un fixed code : appuyer sur le même bouton transmet toujours les mêmes données. C’est l’approche la plus simple (et la moins sécurisée) pour une télécommande RF. Les systèmes plus modernes utilisent des rolling codes, où la valeur transmise change à chaque appui, rendant les replay attacks inefficaces.

Conclusion

On a vu comment analyser un signal de télécommande domotique à 433 MHz, identifier la modulation (OOK), et extraire la longueur de clé et la structure de trame. Des outils comme rtl_433 simplifient beaucoup le processus en automatisant la détection et le décodage. Sans eux, il faudrait démoduler et interpréter manuellement les échantillons IQ bruts, ce qui serait nettement plus complexe.

C’est une compétence utile à développer, car beaucoup d’appareils émettent dans la bande ISM 433 MHz : télécommandes domotiques, stations météo, capteurs de pression de pneus, thermomètres sans fil, et bien d’autres capteurs IoT. Savoir capturer et décoder ces signaux ouvre la voie à la compréhension, au debug ou au reverse engineering d’une bonne partie de l’écosystème sans fil basse consommation.