Il y a quelques temps, j’ai acheté un porte-clefs Bluetooth qui permet d’être notifié lorsque l’objet auquel il est attaché n’est plus à portée. C’est un gadget vraiment lowcost que l’on trouve pour quelques euros sur Amazon ou Aliexpress.
Sur sa face avant, il est muni d’un bouton et à l’arrière, d’une trappe d’accès où se loge une pile LR2032.
Il existe plusieurs applications pour smartphone qui se connectent à cet objet. Dans la plupart d’entre elles, le bouton sert de déclencheur à l’appareil photo.
Lorsque la connexion Bluetooth est rompue, le smartphone affiche une alerte et le porte-clefs émet des bips à intervalles rapprochés. Ceci se révèle problématique pour tout détournement de sa fonction initiale. En effet, toute déconnexion, quelle qu’elle soit, fait retentir les bips. Je songe donc à démonter le boîtier et à dessouder le bipeur.
On pourrait alors vérifier à intervalles réguliers si le porte-clefs est à proximités ou pas et écouter si le bouton est pressé pour déclencher une action domotique.
En principe, si vous utilisez un RPi 3, avec Jessie ou Stretch, les outils gatttool et hcitool que nous allons utiliser plus loin devraient déjà être installés.
Si ce n’est pas le cas, je vous renvoie vers cet article : https://thepihut.com/
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install bluetooth bluez-utils blueman bluez
Pour déterminer cette adresse, nous allons utiliser l’outil hcitool.
$ sudo hcitool lescan
Ce qui devrait nous retourner la liste des périphériques Bluetooth LE (Low Energy) qui se trouvent à proximité :
LE Scan ... 00:A0:50:44:0B:F3 (unknown) 00:A0:50:44:0B:F3 SensePeanut C4:7C:8D:63:85:B1 (unknown) C4:7C:8D:63:85:B1 Flower care FF:FF:30:02:63:59 (unknown) FF:FF:30:02:63:59 iTAG
Nous avons donc un iTAG avec l’adresse MAC : FF:FF:30:02:63:59
Pour nous connecter, nous allons taper cette commande :
$ sudo gatttool --device=FF:FF:30:02:63:59 -I
Une fois démarré, l’outil est prêt à recevoir des commandes et ceci devrait apparaitre à l’écran :
[FF:FF:30:02:63:59][LE]>
On va se connecter avec cette commande :
connect
L’outil devrait répondre quelque chose comme ceci et l’adresse MAC devrait passer en bleu lorsque la connexion est établie :
[FF:FF:30:02:63:59][LE]> connect
Attempting to connect to FF:FF:30:02:63:59
Connection successful
[FF:FF:30:02:63:59][LE]>
Nous allons utiliser la commande primary
pour explorer les handles des services primaires :
[FF:FF:30:02:63:59][LE]> primary
attr handle: 0x0001, end grp handle: 0x0005 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0006, end grp handle: 0x0008 uuid: 0000180f-0000-1000-8000-00805f9b34fb
attr handle: 0x0009, end grp handle: 0x000b uuid: 00001802-0000-1000-8000-00805f9b34fb
attr handle: 0x000c, end grp handle: 0x000e uuid: 0000ffe0-0000-1000-8000-00805f9b34fb
Puis, nous utiliserons la commande char-desc
pour explorer les descripteurs de caractéristiques :
[FF:FF:30:02:63:59][LE]> char-desc handle: 0x0001, uuid: 00002800-0000-1000-8000-00805f9b34fb handle: 0x0002, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb Device Name handle: 0x0004, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb Appearance handle: 0x0006, uuid: 00002800-0000-1000-8000-00805f9b34fb handle: 0x0007, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x0008, uuid: 00002a19-0000-1000-8000-00805f9b34fb Battery Level handle: 0x0009, uuid: 00002800-0000-1000-8000-00805f9b34fb handle: 0x000a, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x000b, uuid: 00002a06-0000-1000-8000-00805f9b34fb Alert Level handle: 0x000c, uuid: 00002800-0000-1000-8000-00805f9b34fb handle: 0x000d, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x000e, uuid: 0000ffe1-0000-1000-8000-00805f9b34fb Non documenté
Nous constatons que les handles 0x0003
, 0x0005
, 0x0008
et 0x000b
sont particuliers. Ils ont des identifiants (uuid) normés repris sur cette page : GATT Characteristics. Je les ai identifiés en rouge.
Le dernier handle (en bleu) 0x000e
est lui aussi particulier. Son identifiant (uuid) 0xffe1
n’est pas normé et est bien différente des autres qui sont dans la tranche 0x280X
. On peut en déduire qu’il a été ajouté par le fabriquant pour cet appareil spécifique.
Pour lire le contenu d’un handle, on utilise la commande char-read-hnd
suivie du n° du handle qui nous intéresse.
Ici, nous allons lire le handle n° 0x0003
qui contient le nom du device :
[FF:FF:30:02:63:59][LE]> char-read-hnd 0x0003 Characteristic value/descriptor: 69 54 41 47 20 20 20 20 20 20 20 20 20 20 20 20
Un petit passage par la table ASCII en exadécimal va nous permettre de convertir chaque octet en texte :
Ce qui, dans ce cas, va nous retourner : iTAG. Le caractère Hex#20 étant un espace.
Voici ce que va nous retourner la lecture des autres handles spéciaux :
Aspect extérieur de l’appareil. Les valeurs sont composées d’une catégorie (10 bits) et de sous-catégories (6 bits). Peut-être la couleur ? Mais sans aucune certitude.
[FF:FF:30:02:63:59][LE]> char-read-hnd 0x0005 Characteristic value/descriptor: 00 00 00 00
Niveau de charge actuel de la batterie. 100% représente la pleine charge alors que 0% représente la pleine décharge.
[FF:FF:30:02:63:59][LE]> char-read-hnd 0x0008 Characteristic value/descriptor: 63
64 en Hex représentant 100% en décimal, 63 en Hex représente ici 99%.
Niveau d’alerte d’un dispositif avec sonnerie.
[FF:FF:30:02:63:59][LE]> char-read-hnd 0x000b Characteristic value/descriptor: 00 00
La valeur est à 00. Il n’existe pas (à ma connaissance) de handle permettant de modifier cette valeur.
Lorsque le bouton est relâché, la valeur est : 00
. Lorsque le bouton est enfoncé, la valeur est : 01
.
[FF:FF:30:02:63:59][LE]> char-read-hnd 0x000e Characteristic value/descriptor: 00
La lecture de ce dernier handle est continue. Lorsque vous appuyez sur le bouton, la ligne suivante s’ajoute à l’écran :
Characteristic value/descriptor: 01
NB. : Tous les handles cités sont en lecture. Je n’en ai trouvé aucun en écriture.
Voici ce que nous allons entrer pour utiliser gatttool en ligne de commande :
$ gatttool -b FF:FF:30:02:63:59 --char-read --handle=0x000e --listen
L’option --listen
permet de se mettre à l’écoute. Le prompt sera bloqué et il faudra utiliser ctrl+c
pour quitter la commande.
A chaque pression du bouton, la ligne suivante apparaîtra à l’écran :
Characteristic value/descriptor: 01
Références :