Site : tvaira.free.fr
Bluetooth est une norme de communications permettant l’échange bidirectionnel de données à très courte distance en utilisant des ondes radio UHF sur une bande de fréquence de 2,4 GHz.
BLE (Bluetooth Low Energy, Bluetooth à basse consommation ou Bluetooth à basse énergie) est une technique de transmission sans fil créée par Nokia en 2006 sous la forme d’un standard ouvert basé sur Bluetooth, qu’il complète mais sans le remplacer. Cette technologie est apparue en 2010 avec la sortie de la version 4.0 du Bluetooth Core Specification.
Comparé au Bluetooth, le BLE permet un débit du même ordre de grandeur (1 Mb/s) pour une consommation d’énergie 10 fois moindre. Cela permet d’intégrer cette technologie dans de nouveaux types d’équipements : montres, appareils de surveillance médicale ou capteurs pour sportifs.
Liens :
Depuis la version 4.0, on distingue le Bluetooth classic du smart (BLE) :
Le protocole BLE repose sur un certain nombre de couches :
S’inspirant de la spécification Bluetooth d’origine, le SIG Bluetooth définit plusieurs profils (spécifications de fonctionnement d’un appareil dans une application particulière) pour les appareils à faible consommation d’énergie. Les fabricants sont censés mettre en œuvre les spécifications appropriées pour leur appareil afin de garantir la compatibilité. Un périphérique peut contenir des implémentations de plusieurs profils. La majorité des profils d’application basse consommation actuels est basée sur le profil d’attribut générique (GATT), une spécification générale pour l’envoi et la réception de données courtes appelées attributs sur une liaison à faible énergie.
Les couches Generic Access Profile (GAP), Generic Attribute Protocol (GATT) et Attribute Protocol (ATT) sont essentielles dans l’échange de données :
GAP (Generic Access Profile) : elle est responsable de l’établissement du lien et du contrôle de connexion entre deux appareils. Le GAP est ce qui rend votre appareil visible au monde extérieur et détermine la manière dont deux appareils peuvent (ou ne peuvent pas) interagir. Le GAP définit différents rôles pour les appareils dont : les appareils centraux (central device) et les appareils périphériques (peripheral device).
GATT (Generic Attribute Profile) : il s’agit d’un ensemble de règles décrivant comment structurer, présenter et transférer des données. La structure définit les éléments de base, tels que les services et les caractéristiques, utilisés dans un profil.
ATT (Attribute Protocol) : L’ATT repose sur une relation client/serveur. Le serveur dispose des informations (telles que les valeurs des capteurs). Le client est celui qui veut accèder à ces informations. ATT permet à un serveur d’exposer à un client un ensemble d’attributs. Un attribut est une valeur associée aux trois propriétés suivantes: un type d’attribut défini par un UUID, un descripteur d’attribut et un ensemble d’autorisations.
Remarque : La couche LL (Link Layer) introduit les deux modes maître (master) et esclave (slave).
La couche GAP (Generic Access Profile) introduit 4 rôles : broadcaster, scanner (ou observer), peripheral et central.
Il y a deux types de communication : le mode dit connecté (peripheral <-> central) et le mode advertising (broadcaster -> scanner).
Les appareils BLE sont détectés via une procédure basée sur la diffusion de paquets advertising. Ceci est fait en utilisant 3 canaux distincts, afin de réduire les interférences. Le dispositif advertising envoie un paquet sur au moins un de ces trois canaux, avec une période de répétition appelée advertising interval. Pour réduire le risque de plusieurs collisions consécutives, un délai aléatoire pouvant atteindre 10 millisecondes est ajouté à chaque advertising interval. Le scanner écoute le canal pendant une durée appelée scan window, qui se répète périodiquement à chaque intervalle de scrutation (scan interval). La latence de découverte est donc déterminée par un processus probabiliste et dépend des trois paramètres (advertising interval, scan interval et scan window).
GATT (Generic Attribute Profile) est une méthode de présentation de données utilisée par les périphériques BLE.
La communication est basée sur les rôles suivants :
La spécification Bluetooth Core définit un service comme un ensemble de données et de comportements associés permettant d’accomplir une fonction ou une fonctionnalité particulière. Un service peut contenir des caractéristiques obligatoires et des caractéristiques facultatives. Par exemple, le service de thermomètre médical comprend des caractéristiques pour une valeur de mesure de température et un intervalle de temps entre les mesures.
Remarque : Le groupement Bluetooth SIG a prédéfini certains services mais il est aussi possible de créer des services personnalisés.
La spécification Bluetooth Core définit une caractéristique comme une valeur utilisée dans un service, ainsi que des propriétés et des informations de configuration sur le mode d’accès à la valeur et sur le mode d’affichage ou de représentation de la valeur. C’est une valeur de données transférée entre le client et le serveur, par exemple la tension actuelle de la batterie. Les paramètres de sécurité, les unités et autres métadonnées sont également encapsulés dans les caractéristiques.
Un descripteur fournit des informations supplémentaires sur une caractéristique. Par exemple, une caractéristique de valeur de température peut avoir une indication de ses unités (par exemple Celsius) et des valeurs maximales et minimales que le capteur peut mesurer. Les descripteurs sont facultatifs - chaque caractéristique peut avoir un nombre quelconque de descripteurs.
Liens :
Les services, les caractéristiques et les descripteurs sont appelés attributs. Ils sont identifiés par des UUID. On peut choisir un UUID aléatoire ou pseudo-aléatoire pour des utilisations propriétaires, mais une plage d’UUID (de la forme xxxxxxxx-0000-1000-8000-00805F9B34FB) a été réservée pour les attributs standards. Pour plus d’efficacité, ces identificateurs sont représentés par des valeurs de 16 bits ou de 32 bits dans le protocole, plutôt que par les 128 bits requis pour un UUID complet. Par exemple, le service d’informations sur le périphérique (Device Information) a le code abrégé 0x180A, plutôt que 0000180A-0000-1000-… Voir la liste complète. Les UUID de 128 bits, sont ceux utilisés pour créer ses propres services et caractéristiques personnalisés.
Il existe un certain nombre de commandes permettant au client de découvrir des informations sur le serveur :
Des commandes sont également fournies pour lire (transfert de données du serveur vers le client) et écrire (du client vers le serveur) les valeurs des caractéristiques.
Enfin, le GATT offre des notifications et des indications. Le client peut demander une notification pour une caractéristique particulière du serveur. Le serveur peut alors envoyer la valeur au client dès qu’il est disponible. Par exemple, un serveur de capteur de température peut avertir son client chaque fois qu’il prend une mesure. Cela évite au client de devoir interroger le serveur, ce qui nécessiterait que le circuit radio du serveur soit constamment opérationnel.
Une indication est similaire à une notification, sauf qu’elle nécessite une réponse du client, confirmant qu’elle a bien reçu le message.
Le groupement Bluetooth SIG a défini un service appelé service de fréquence cardiaque (heart rate). Les montres de ce type utilisent généralement au moins deux services :
Le concept du GATT est de regrouper les attributs dans une table d’attributs dans un ordre spécifique et logique. Le profil de fréquence cardiaque présenté dans le tableau ci-dessous est un exemple : chaque ligne est un attribut et chaque attribut a un descripteur, un type, un ensemble d’autorisations et une valeur.
Au sommet de chaque groupe, il y a toujours un attribut de déclaration de service. L’UUID standard pour les déclarations de service est 0x2800. La valeur est un autre UUID définissant le type de service concerné : ici la valeur 0x180D qui est l’UUID défini par le groupement Bluetooth SIG pour le service de fréquence cardiaque. Cet exemple est détaillé ici.
La caractéristique de mesure de la fréquence cardiaque a l’UUID 0x2A37.
Les valeurs de la caractéristique “Emplacement du capteur corporel” (Body Sensor Location) sont disponibles : ici
Utilisation d’un dongle USB Bluetooth : Inateck Nano Bluetooth V4.0 (CSR8510).
Prise en charge matériel :
$ dmesg
[347235.128548] usb 3-10.1: new full-speed USB device number 24 using xhci_hcd
[347235.177526] usb 3-10.1: New USB device found, idVendor=0a12, idProduct=0001
[347235.177535] usb 3-10.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[347235.177541] usb 3-10.1: Product: CSR8510 A10
[347235.246735] usbcore: registered new interface driver btusb
$ lsusb
...
Bus 003 Device 024: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
$ dpkg --status bluez | grep '^Version:'
Version: 5.48-0ubuntu3.1
Les outils de test sous Linux ont déjà été présenté dans ce document : Mise en oeuvre du Bluetooth
$ hciconfig
hci0: Type: Primary Bus: USB
BD Address: 00:1A:7D:DA:71:13 ACL MTU: 310:10 SCO MTU: 64:8
UP RUNNING PSCAN ISCAN
RX bytes:1148408 acl:478 sco:0 events:46787 errors:0
TX bytes:108846 acl:467 sco:0 commands:10191 errors:0
$ bluetoothctl
[NEW] Controller 00:1A:7D:DA:71:13 sedatech [default]
Agent registered
[bluetooth]# help
...
$ hcitool --help | grep LE
lescan Start LE scan
leinfo Get LE remote information
lewladd Add device to LE White List
lewlrm Remove device from LE White List
lewlsz Read size of LE White List
lewlclr Clear LE White List
lerladd Add device to LE Resolving List
lerlrm Remove device from LE Resolving List
lerlclr Clear LE Resolving List
lerlsz Read size of LE Resolving List
lerlon Enable LE Address Resolution
lerloff Disable LE Address Resolution
lecc Create a LE Connection
ledc Disconnect a LE Connection
lecup LE Connection Update
$ sudo gatttool --help-gatt
Usage:
gatttool [OPTION?]
GATT commands
--primary Primary Service Discovery
--characteristics Characteristics Discovery
--char-read Characteristics Value/Descriptor Read
--char-write Characteristics Value Write Without Response (Write Command)
--char-write-req Characteristics Value Write (Write Request)
--char-desc Characteristics Descriptor Discovery
--listen Listen for notifications and indications
-I, --interactive Use interactive mode
Remarque : La pile de protocoles Bluetooth nécessite des droits root (hcitool lescan par exemple). Il est possible d’affecter ces capacités à un programme :
$ sudo apt-get install libcap2-bin
$ sudo setcap 'cap_net_raw,cap_net_admin+eip' `which hcitool`
N’ayant pas encore de montre connectée, les tests ont été réalisés avec le Flower Power (Parrot) :
$ sudo hcitool lescan
LE Scan ...
A0:14:3D:0C:8E:91 Flower power 8E91
...
$ sudo hcitool lecc A0:14:3D:0C:8E:91
Connection handle 70
$ hcidump -X
HCI sniffer - Bluetooth packet analyzer ver 2.2
device: hci0 snap_len: 1028 filter: 0xffffffffffffffff
> HCI Event: Command Status (0x0f) plen 4
LE Create Connection (0x08|0x000d) status 0x00 ncmd 1
> HCI Event: Command Status (0x0f) plen 4
Read Remote Version Information (0x01|0x001d) status 0x00 ncmd 1
> HCI Event: Read Remote Ver Info Complete (0x0c) plen 8
status 0x00 handle 70
LMP Version: 4.0 (0x6) LMP Subversion: 0x130
Manufacturer: Texas Instruments Inc. (13)
$ hcidump -R
HCI sniffer - Bluetooth packet analyzer ver 2.2
device: hci0 snap_len: 1028 filter: 0xffffffffffffffff
> 0000: 04 0e 04 01 0b 20 00 ..... .
> 0000: 04 0e 04 01 0c 20 00 ..... .
> 0000: 04 0e 04 01 0c 20 00 ..... .
$ sudo hcitool ledc 70
$ sudo gatttool -i hci0 -b A0:14:3D:0C:8E:91 --primary
attr handle: 0x0001, end grp handle: 0x000b uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x000c, end grp handle: 0x000f uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x0010, end grp handle: 0x0022 uuid: 0000180a-0000-1000-8000-00805f9b34fb
attr handle: 0x0023, end grp handle: 0x0041 uuid: 39e1fa00-84a8-11e2-afba-0002a5d5c51b
attr handle: 0x0042, end grp handle: 0x0045 uuid: 0000180f-0000-1000-8000-00805f9b34fb
attr handle: 0x0046, end grp handle: 0x005e uuid: 39e1fc00-84a8-11e2-afba-0002a5d5c51b
attr handle: 0x005f, end grp handle: 0x006d uuid: 39e1fb00-84a8-11e2-afba-0002a5d5c51b
attr handle: 0x006e, end grp handle: 0x0071 uuid: 39e1fd00-84a8-11e2-afba-0002a5d5c51b
attr handle: 0x0072, end grp handle: 0x007e uuid: 39e1fe00-84a8-11e2-afba-0002a5d5c51b
attr handle: 0x007f, end grp handle: 0xffff uuid: f000ffc0-0451-4000-b000-000000000000
$ sudo gatttool -i hci0 -b A0:14:3D:0C:8E:91 --characteristics
handle: 0x0002, char properties: 0x0e, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, char properties: 0x0a, char value handle: 0x0007, uuid: 00002a02-0000-1000-8000-00805f9b34fb
handle: 0x0008, char properties: 0x0a, char value handle: 0x0009, uuid: 00002a03-0000-1000-8000-00805f9b34fb
handle: 0x000a, char properties: 0x02, char value handle: 0x000b, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x000d, char properties: 0x20, char value handle: 0x000e, uuid: 00002a05-0000-1000-8000-00805f9b34fb
handle: 0x0011, char properties: 0x02, char value handle: 0x0012, uuid: 00002a23-0000-1000-8000-00805f9b34fb
handle: 0x0013, char properties: 0x02, char value handle: 0x0014, uuid: 00002a24-0000-1000-8000-00805f9b34fb
handle: 0x0015, char properties: 0x02, char value handle: 0x0016, uuid: 00002a25-0000-1000-8000-00805f9b34fb
handle: 0x0017, char properties: 0x02, char value handle: 0x0018, uuid: 00002a26-0000-1000-8000-00805f9b34fb
handle: 0x0019, char properties: 0x02, char value handle: 0x001a, uuid: 00002a27-0000-1000-8000-00805f9b34fb
handle: 0x001b, char properties: 0x02, char value handle: 0x001c, uuid: 00002a28-0000-1000-8000-00805f9b34fb
handle: 0x001d, char properties: 0x02, char value handle: 0x001e, uuid: 00002a29-0000-1000-8000-00805f9b34fb
handle: 0x001f, char properties: 0x02, char value handle: 0x0020, uuid: 00002a2a-0000-1000-8000-00805f9b34fb
handle: 0x0021, char properties: 0x02, char value handle: 0x0022, uuid: 00002a50-0000-1000-8000-00805f9b34fb
handle: 0x0024, char properties: 0x12, char value handle: 0x0025, uuid: 39e1fa01-84a8-11e2-afba-0002a5d5c51b
handle: 0x0028, char properties: 0x12, char value handle: 0x0029, uuid: 39e1fa02-84a8-11e2-afba-0002a5d5c51b
handle: 0x002c, char properties: 0x12, char value handle: 0x002d, uuid: 39e1fa03-84a8-11e2-afba-0002a5d5c51b
handle: 0x0030, char properties: 0x12, char value handle: 0x0031, uuid: 39e1fa04-84a8-11e2-afba-0002a5d5c51b
handle: 0x0034, char properties: 0x12, char value handle: 0x0035, uuid: 39e1fa05-84a8-11e2-afba-0002a5d5c51b
handle: 0x0038, char properties: 0x0a, char value handle: 0x0039, uuid: 39e1fa06-84a8-11e2-afba-0002a5d5c51b
handle: 0x003b, char properties: 0x0a, char value handle: 0x003c, uuid: 39e1fa07-84a8-11e2-afba-0002a5d5c51b
handle: 0x003e, char properties: 0x12, char value handle: 0x003f, uuid: 39e1fa08-84a8-11e2-afba-0002a5d5c51b
handle: 0x0043, char properties: 0x12, char value handle: 0x0044, uuid: 00002a19-0000-1000-8000-00805f9b34fb
handle: 0x0047, char properties: 0x02, char value handle: 0x0048, uuid: 39e1fc01-84a8-11e2-afba-0002a5d5c51b
handle: 0x004b, char properties: 0x02, char value handle: 0x004c, uuid: 39e1fc02-84a8-11e2-afba-0002a5d5c51b
handle: 0x004f, char properties: 0x0a, char value handle: 0x0050, uuid: 39e1fc03-84a8-11e2-afba-0002a5d5c51b
handle: 0x0053, char properties: 0x02, char value handle: 0x0054, uuid: 39e1fc04-84a8-11e2-afba-0002a5d5c51b
handle: 0x0057, char properties: 0x02, char value handle: 0x0058, uuid: 39e1fc05-84a8-11e2-afba-0002a5d5c51b
handle: 0x005b, char properties: 0x02, char value handle: 0x005c, uuid: 39e1fc06-84a8-11e2-afba-0002a5d5c51b
handle: 0x0060, char properties: 0x10, char value handle: 0x0061, uuid: 39e1fb01-84a8-11e2-afba-0002a5d5c51b
handle: 0x0064, char properties: 0x12, char value handle: 0x0065, uuid: 39e1fb02-84a8-11e2-afba-0002a5d5c51b
handle: 0x0068, char properties: 0x0a, char value handle: 0x0069, uuid: 39e1fb03-84a8-11e2-afba-0002a5d5c51b
handle: 0x006b, char properties: 0x0a, char value handle: 0x006c, uuid: 39e1fb04-84a8-11e2-afba-0002a5d5c51b
handle: 0x006f, char properties: 0x02, char value handle: 0x0070, uuid: 39e1fd01-84a8-11e2-afba-0002a5d5c51b
handle: 0x0073, char properties: 0x02, char value handle: 0x0074, uuid: 39e1fe01-84a8-11e2-afba-0002a5d5c51b
handle: 0x0076, char properties: 0x02, char value handle: 0x0077, uuid: 39e1fe02-84a8-11e2-afba-0002a5d5c51b
handle: 0x0079, char properties: 0x0a, char value handle: 0x007a, uuid: 39e1fe03-84a8-11e2-afba-0002a5d5c51b
handle: 0x007c, char properties: 0x02, char value handle: 0x007d, uuid: 39e1fe04-84a8-11e2-afba-0002a5d5c51b
handle: 0x0080, char properties: 0x0e, char value handle: 0x0081, uuid: f000ffc1-0451-4000-b000-000000000000
handle: 0x0083, char properties: 0x0e, char value handle: 0x0084, uuid: f000ffc2-0451-4000-b000-000000000000
$ sudo gatttool -i hci0 -b A0:14:3D:0C:8E:91 -I
[ ][A0:14:3D:0C:8E:91][LE]> connect
[CON][A0:14:3D:0C:8E:91][LE]> char-read-uuid 2A19
handle: 0x0044 value: 64
// 64 -> 100 %
[CON][A0:14:3D:0C:8E:91][LE]> char-read-uuid 2A26
handle: 0x0018 value: 32 30 31 33 2d 31 31 2d 32 37 5f 68 61 77 61 69 69 2d 31
2 0 1 3 - 1 1 - 2 7 _ h a w a i i . 1
[CON][A0:14:3D:0C:8E:91][LE]> disconnect
[ ][A0:14:3D:0C:8E:91][LE]>
// 0xFA02 Soil EC
// char value handle: 0x0029, uuid: 39e1fa02-84a8-11e2-afba-0002a5d5c51b
$ sudo gatttool -i hci0 -b A0:14:3D:0C:8E:91 --char-read --handle=0x0029
Characteristic value/descriptor: 00 00
// 0xFA03 Soil Temp
// char value handle: 0x002d, uuid: 39e1fa03-84a8-11e2-afba-0002a5d5c51b
$ sudo gatttool -i hci0 -b A0:14:3D:0C:8E:91 --char-read --handle=0x002D
Characteristic value/descriptor: dc 02
// 02DC -> 732
// 0xFA04 Air Temp
// char value handle: 0x0031, uuid: 39e1fa04-84a8-11e2-afba-0002a5d5c51b
$ sudo gatttool -i hci0 -b A0:14:3D:0C:8E:91 --char-read --handle=0x0031
Characteristic value/descriptor: d5 02
// 02D5 -> 725
// 0xFA05 Soil VWC
// char value handle: 0x0035, uuid: 39e1fa05-84a8-11e2-afba-0002a5d5c51b
$ sudo gatttool -i hci0 -b A0:14:3D:0C:8E:91 --char-read --handle=0x0035
Characteristic value/descriptor: 9c 00
// 0x2A00 Name UTF8 String
// char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
$ sudo gatttool -i hci0 -b A0:14:3D:0C:8E:91 --char-read --handle=0x0003
Characteristic value/descriptor: 46 6c 6f 77 65 72 20 70 6f 77 65 72 20 38 45 39 31
F l o w e r p o w e r 8 E 9 1
// The LED of the FlowerPower device is controlled by the characteristic which UUID is 0xFA07 :
// -‐ Writing 1 on the LED state (0xFA07) characteristic value turns the LED on.
// -‐ Writing 0 on the LED state (0xFA07) characteristic value turns the LED off.
// Note : that the LED is automatically turned off when the device is disconnected.
// char value handle: 0x003c, uuid: 39e1fa07-84a8-11e2-afba-0002a5d5c51b
$ sudo gatttool -i hci0 -b A0:14:3D:0C:8E:91 --char-write-req --value=01 --handle=0x003c --listen
$ sudo gatttool -i hci0 -b A0:14:3D:0C:8E:91 --char-read --handle=0x003C
L’ESP32 est un microcontrôleur intégrant notamment le WiFi et le Bluetooth.
Activité : Mise en oeuvre du Bluetooth BLE sur ESP32
L’Arduino/Genuino 101 embarque deux cœurs de 32 bits (un x86 Quark et un 32-bit ARC) sous la forme d’un SoC Curie d’Intel à 32 MHz. Elle possède un accéléromètre/gyroscope à 6 axes et un module radio Bluetooth Low Energy (BLE).
Liens :
Avec la bibliothèque CurieBLE, il est possible d’utiliser les fonctionnalités BLE de l’Arduino/Genuino 101.
Exemples :
Le Raspberry Pi 3 dispose d’une puce Wifi et Bluetooth 4.x intégrée et prend donc en charge la technologie Bluetooth Low Energy (BLE).
Lien : Getting Started
$ sudo hciconfig
hci0: Type: BR/EDR Bus: UART
BD Address: 5C:31:3E:28:50:92 ACL MTU: 1021:6 SCO MTU: 180:4
UP RUNNING PSCAN
RX bytes:636 acl:0 sco:0 events:39 errors:0
TX bytes:994 acl:0 sco:0 commands:39 errors:0
On peut utiliser la Raspberry Pi 3 soit comme un central device (client GATT) soit comme un peripheral device (serveur GATT). Dans le cas d’un appareil périphérique (peripheral device), on pourra gérer l’advertising de la manière suivante :
// Activer l'advertising :
$ sudo hciconfig hci0 leadv 0
// Désactiver l'advertising :
$ sudo hciconfig hci0 noleadv
L’API Qt Bluetooth Low Energy a été introduite dans Qt 5.4. Depuis Qt 5.5, cette partie de l’API est définitive et une garantie de compatibilité est donnée pour les versions futures. Depuis Qt 5.7, une API supplémentaire prenant en charge le rôle de périphérique a été ajoutée, avec le backend implémenté pour Linux/BlueZ, iOS et macOS.
Activités :
Android 4.3 (API de niveau 18) introduit le support pour le Bluetooth Low Energy (BLE) dans le rôle central et fournit des API que les applications peuvent utiliser pour découvrir des périphériques, rechercher des services et transmettre des informations.
Activité : Mise en oeuvre du Bluetooth BLE sous Android