Mes passions, le boulots, mes coups de gueule...




Gatttool : Analyse du porte-clefs iTAG

Categorie : Geek, Informatique, Linux, Raspberry Pi · par 1 Jan 2018

Introduction

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.

Analyse des handles

Installation du bluetooth

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

Déterminer l’adresse MAC du iTAG

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

Importer les données avec gatttool

Premiers pas avec gatttool

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]>

Services primaires

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

Descripteurs de caractéristiques

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.

Lecture des handles

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 handle0x0003 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.

Lecture des autres handles spéciaux

Voici ce que va nous retourner la lecture des autres handles spéciaux :

Appearance

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

Battery Level

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%.

Alert Level

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.

Pression du bouton

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

Handles en écriture

NB. : Tous les handles cités sont en lecture. Je n’en ai trouvé aucun en écriture.

En ligne de commande

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 :

Laisser un commentaire