Découverte du protocole Bluetooth Low Energy (BLE) par la pratique

Le but de cet article est d’analyser le protocole sans fil BLE à l’aide d’un capteur de température Xiaomi Mi Home et d’une application pour smartphone puis d’un dongle USB. L’objectif étant d’arriver à récupérer des informations du capteur sans passer par l’application officielle Xiaomi.

1. Matériel nécessaire

Tout d’abord, il faut acheter au minimum dongle USB avec le composant CC2540 et avec un câble de programmation :
L’original du fabricant TI à la référence CC2540EMK-USB, mais il en existe des similaires sur des sites comme Amazon, AliExpress
https://www.amazon.fr/AILOVA-D%C3%A9bogage-dInterface-Broche1Mbps-Renifleur/dp/B07Y858TDF/
https://fr.aliexpress.com/item/1005001847937687.html

Ensuite, un programmateur CC DEBUG :
https://www.amazon.fr/gp/product/B07FP5XHPM
et le capteur Xiaomi Mi Temperature and Humidity Monitor 2
Modèle : LYWSD03MMC
Il est compatible Bluetooth Low Energy BLE 4.2
on peut le trouver chez Boulanger ou sur sur AliExpress pour moins de 10€

Il n’est pas nécessaire d’avoir une passerelle Xiaomi, le capteur peut se connecter directement à un smartphone.

2. Test avec l’application nRF Connect

Télécharger l’application nRF Connect sur un smartphone Android ou Apple

Mettre le capteur de température à proximité du smartphone et lancer un scan.

Vous allez voir apparaître une ligne avec « LYWSD03MMC ». Avec l’application, on peut se connecter au capteur et lire plusieurs informations.

2. Lecture des paquets avec le dongle USB CC2540 de TI

Installer le logiciel SmartRF Flash programmer de Texas Instruments. Ne pas utiliser la version V2 qui n’est pas compatible avec le CC DEBUGGER. Par exemple la version 1.12.8 du 31 Mai 2016.
Le logiciel est gratuit, mais il faut avoir un compte TI pour le télécharger.
https://www.ti.com/tool/FLASH-PROGRAMMER
Ensuite, il faut installer le driver pour le CC DEBUGGER :
https://www.ti.com/lit/zip/swrc212
Après avoir installé le driver, connecter le CC DEBUGGER au PC. Vérifier que le debugger est bien reconnu en ouvrant le « Gestionnaire de Périphériques » de Windows. Le debugger devrait apparaitre comme un « Cebal controlled device »

Vérification du driver du CC DEBUGGER

Si le driver, n’est pas installé correctement, vous pouvez installer le driver manuellement.
Télécharger et installer le logiciel PACKET-SNIFFER :
https://www.ti.com/tool/PACKET-SNIFFER
(Ne pas utiliser SmartRF Packet Sniffer 2, il n’est pas compatible avec le CC2540) prendre par exemple la version v2.18.1 du 30 Juin 2014)
Récupérer le fichier C:\Program Files (x86)\Texas Instruments\SmartRF Tools\Packet Sniffer\bin\general\firmware\sniffer_fw_cc2540_usb.hex

3. Connecter le CC DEBUGGER

Brancher le CC DEBUGGER à un port USB du PC puis au dongle CC2540 qui lui même doit être connecté à un autre port USB du PC, comme sur la figure ci-dessous :

Branchements

Appuyer sur le bouton RESET du CC DEBUGGER, la LED devrait s’allumer en vert.

4.Programmation

Exécuter le logiciel Flash Programmer, dans la section Flash image, sélectionnez le fichier sniffer_fw_cc2540_usb.hex
Cliquer sur « Perform actions »

TI Flash Programmer

4. Lecture des trames

Exécuter le logiciel SmartRF Packet Sniffer, sélectionner le protocole « Bluetooth Low Energy » et cliquer sur « Start »

Logicel TI SmartRF Packet Sniffer

Vérifier que le dongle est bien reconnu et cliquer sur le bouton « Play » :

SmartRF Packet Sniffer démarrage

Les premières trames devraient apparaître. Il peut y en avoir beacoup car il y a de plus en plus d’émetteur Bluetooth autour de nous !
Mettre le capteur proche du dongle et observer la valeur RSSI. C’est la puissance du signal reçue. La valeur la plus élevée sera probablement celle du capteur.
Ici on voit -34dBm. Noter la valeur AdvA qui est l’adresse du capteur. Ici 0xA4C1388F4833

Affichage des trames BLE

Maintenant, on va filtrer les trames.
Dans le menu « Display filter », sélectionner le « Field Name » = ADV_IND AdvA et appuyer sur le bouton « First », puis entrer l’adresse AdvA récupéré plus haut dans le champ « Filter condition » : AA1=0xA4C1388F4833, cliquer sur Add, puis « Apply filter ».

Filtrage les trames BLE

On va chercher à retrouver le nom du capteur.
On peut constater que toutes les trames ADV_IND sont identiques, c’est des trames d' »ADVERTISEMENT ». Les données sont dans AdvData, mais on ne trouve pas le nom du capteur.
Donc cela doit être dans une autre trame. En effet, il est possible d’envoyer une trame ADV_SCAN_REQ et le capteur répondra par une trame ADV_SCAN_RSP on va donc rechercher ces trames.
Dans le menu « Display filter », sélectionner « Field Name » = « ADV_SCANRSP AdvA »
Cliquer sur le bouton « First », puis entrer l’adresse AdvA récupéré plus haut dans le champ « Filter condition » : AA5=0xA4C1388F4833
Cliquer sur Add, puis sur Apply filter.
Au bout d’un certain temps une trame va apparaitre :

Trame ADV_SCANRSP

Dans cette trame, on peut analyser les données « ScanRspData » et observer que le code hexadécimal convertit en caractères ASCII correspond bien au nom du capteur :

4C5957534430334D4D43
LYWSD03MMC
Décodage nom du capteur en ASCII

Dans un autre article, on apprendra à décoder les trames BLE et voir si il est possible de décoder les données de température et d’humidité du capteur.