Utilisation du Bluetooth Low Energy

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation du Bluetooth


Puisque "Bluetooth Core Specification" définit depuis la version 4.0 différents types de protocoles "Bluetooth", tels que Bluetooth Low Energy, le protocole Bluetooth original est désormais connu sous le terme "Classic Bluetooth". 
Bluetooth Low Energy ou Smart Bluetooth fournit un nouvel environnement pour les périphériques qui transfèrent un petit volume de données et qui consomment moins d'énergie.
Pour implémenter la prise en charge du BluetoothLE pour les services standard dans vos applications :

Prise en charge des plates-formes

Plate-forme Bluetooth Low Energy
Client Serveur
Windows(*)
10+
10+ (**)

macOS

10.7+
10.9+ 
iOS
5+
6+
Android
4.3+
5+
Remarque: Windows Server ne prend pas en charge Bluetooth, voir General Bluetooth Support in Windows (EN).
Remarque: L'API WinRT Bluetooth prend en charge les données publicitaires BLE via le champ des données spécifiques au fabricant, mais n'implémente pas entièrement les fonctionnalités du serveur GATT.
Remarque: La liste de propriétés iOS inclut la configuration pour Bluetooth LE.
Attention: Les applications s'exécutant sur une plate-forme Windows antérieure à Windows 10 ne prennent pas en charge Bluetooth LE.

Profils GATT (GENERIC ATTRIBUTE PROFILE)

Les profils sont des définitions de haut niveau qui définissent comment utiliser des services standard dans vos applications. Par exemple, le profil Heart Rate (Fréquence cardiaque) est utilisé pour les applications d'entraînement physique ou de santé. Le périphérique serveur équipé d'un capteur de fréquence cardiaque expose le service Heart Rate standard pour que le client BluetoothLE découvre le service et commence à collecter des données, par exemple les bpm (battements par minute).
Le profil GATT est la combinaison de service + caractéristiques.
Pour plus d'informations sur les profils GATT, consultez la page officielle des spécifications GATT pour profils standard (EN).

Placement d'un composant TBluetoothLE

Utilisez le nouveau composant TBluetoothLE pour implémenter la fonctionnalité RTL BluetoothLE pour les applications serveur et client.
TBluetoothLE inclut l'unité System.Bluetooth dans votre application et appelle en interne TBluetoothLEManager.Current pour obtenir une instance de TBluetoothLEManager. TBluetoothLEManager est la classe principale des communications Bluetooth Low Energy.
Remarque: TBluetoothLEManager.Current renvoie toujours la même instance de TBluetoothLEManager. Une seule instance de TBluetoothLEManagersuffit.

Découverte des périphériques

BluetoothLE ne fonctionne pas comme Classic Bluetooth, vous n'avez pas besoin d'appairer les périphériques. Les clients BluetoothLE doivent découvrir les serveurs BluetoothLE. 
Remarque:
  • Les applications s'exécutant sur une plate-forme Windows inférieure à Windows 10 doivent appairer les périphériques avant la découverte des serveurs BluetoothLE. Pour de plus amples informations, voir Windows Bluetooth FAQ (EN).
  • Les plates-formes de l'API WinRT pour Windows 10+ vous permettent d'analyser les périphériques sans avoir besoin de les appairer.
Utilisez la méthode DiscoverDevices pour découvrir des serveurs BluetoothLE.
procedure DoScan;
const 
  HeartRateService: TBluetoothUUID = '{0000180D-0000-1000-8000-00805F9B34FB}';
begin
  BluetoothLE1.DiscoverDevices(2500) // The parameter is the timeout in milliseconds. 
  BluetoothLE1.DiscoverDevices(2500, [HRService]) // It only exposes devices with the Heart Rate service to the BluetoothLE client.
end;
Une fois la procédure terminée, l'événement OnEndDiscoverDevices est déclenché. Quand vous avez découvert le périphérique, vous pouvez commencer à obtenir les services et les caractéristiques du profil standard comme indiqué ci-dessous.
Attention: Lors de l'utilisation d'iOS 13.3.1 et 13.3.0, les méthodes de découverte des périphériques Bluetooth LE TBluetoothManagerLE.StartDiscovery et TBluetoothLE.DiscoverDevices entraînent la fermeture sans préavis de l'application mobile.

Utilisation des filtres d'analyse

La RTL fournit une implémentation de filtres d'analyse BLE qui bénéficie des nouvelles puces BLE basse consommation.
Vous pouvez rechercher des périphériques BLE spécifiques par le biais de filtres d'analyse indépendants personnalisés :
Remarque: Pour s'assurer que la détection des beacons s'effectue correctement, les utilisateurs Android doivent s'assurer de configurer d'abord les services de localisation.
procedure DoScanWithFilter;
const 
  HeartRateService: TGUID = '{0000180D-0000-1000-8000-00805F9B34FB}';
var
  ABLEAdvertisedDataFilter: TBluetoothLEScanFilter;
  ABLEAdvertisedDataFilterList: TBluetoothLEScanFilterList;
begin
  ABLEAdvertisedDataFilter:= TBluetoothLEScanFilter.Create;
  ABLEAdvertisedDataFilterList:= TBluetoothLEScanFilterList.Create;
  ABLEAdvertisedDataFilter.ServiceUUID:= HeartRateService; 
  ABLEAdvertisedDataFilterList.Add(ABLEAdvertisedDataFilter);

  BluetoothLE1.CurrentManager.StartDiscovery(2500,ABLEAdvertisedDataFilterList);
end;

Services et caractéristiques

Découverte et obtention des services

Les services sont des collections de caractéristiques et de relations avec d'autres services qui encapsulent le comportement d'une partie d'un périphérique.
Un profil GATT inclut un ou plusieurs services standard qui sont identifiés par un numéro. Par exemple, le numéro officiel suivant a été attribué au service Heart Rate (Fréquence cardiaque) : "0x180D".
Vous trouverez des informations concernant les services standard sur la page officielle des services BluetoothLE standard (EN).
Pour obtenir un service, vous devez utiliser l'UUID complet, c'est-à-dire le numéro attribué au service standard + le code Bluetooth de base, par exemple le code complet du service Heart Rate est 0000180D-0000-1000-8000-00805F9B34FB.
Utilisez la méthode DiscoverServices pour découvrir les services d'un périphérique particulier. Une fois les services découverts, l'événement OnServicesDiscovered est déclenché.
Quand vous avez découvert les services, vous devez les obtenir. Utilisez la méthode GetServices pour obtenir la liste des services d'un périphérique ou la méthode GetService pour obtenir un service particulier pour un périphérique.

Découverte et obtention des caractéristiques

Un service peut contenir une ou plusieurs caractéristiques qui fournissent des informations pour le service particulier. Chaque caractéristique est identifiée par un numéro officiel. Par exemple, le service Heart Rate possède une caractéristique permettant de mesurer la fréquence cardiaque, Heart Rate Measurement avec l'UUID  00002A37-0000-1000-8000-00805F9B34FB , et une autre caractéristique permettant d'identifier l'emplacement du capteur corporel, Body Sensor Location avec l'UUID  00002A38-0000-1000-8000-00805F9B34FB.
Utilisez la méthode GetCharacteristics pour obtenir la liste des caractéristiques d'un service particulier ou la méthode GetCharacteristic pour obtenir les informations d'une caractéristique particulière.

Lecture, écriture ou abonnement à une caractéristique

Quand vous avez obtenu la caractéristique en utilisant GetCharacteristic, vous pouvez lire ou écrire (le cas échéant) les informations contenues. Le gestionnaire d'événement OnCharacteristicRead est déclenché après la lecture de la caractéristique.
Pour obtenir la valeur en cours d'une caractéristique, utilisez la méthode ReadCharacteristic. Utilisez WriteCharacteristic pour écrire si cette option est disponible sur le serveur.
Vous pouvez également vous abonner à une caractéristique pour obtenir les informations chaque fois qu'elle change. Par exemple, pour commencer à surveiller le capteur de fréquence cardiaque, vous pouvez lire la valeur en cours avec la méthode GetCharacteristic, puis utiliser la méthode SubscribeToCharacteristic pour obtenir les informations quand elle change. Pour arrêter la surveillance, utilisez la méthode UnSubscribeToCharacteristic.

Traitement des données reçues

Le périphérique client reçoit un tableau de données du serveur. Pour traduire les données en informations lisibles, suivez la spécification sur le profil GATT. Par exemple, vous pouvez trouver les détails concernant les packages de données sur la page officielle de la caractéristique Heart Rate Measurement : Structure des packages de données de la caractéristique Heart Rate Measurement (EN).
Par exemple, pour la caractéristique Heart Rate Measurement, le premier octet contient des indicateurs avec des informations concernant les données transportées sur le package Bluetooth LE. Le bit 0 du champ Flags définit le format de la valeur Heart Rate : UINT8 ou UINT16. Selon le format, vous devez extraire le second octet du package de données ou les deuxième et troisième packages pour obtenir les bpm (battements par minute).

Serveur BluetoothLE

Pour créer un serveur qui expose ou publie des services standard :
  1. Placez un composant TBluetoothLE dans votre projet.
  2. Utilisez la méthode GetGattServer pour publier des services Bluetooth Low Energy.
  3. Utilisez la méthode CreateService de la classe TBluetoothGattServer pour créer le service en utilisant l'UUID standard.
  4. Utilisez la méthode CreateCharacteristic de la classe TBluetoothGattServer pour créer les caractéristiques du service en utilisant les UUID standard.
  5. Utilisez la méthode AddService pour ajouter le service au serveur Gatt.
  6. Le gestionnaire d'événement OnCharacteristicReadRequest est déclenché quand le serveur reçoit une requête de lecture du périphérique client.
  7. Le gestionnaire d'événement OnCharacteristicWriteRequest est déclenché quand le serveur reçoit une requête d'écriture du périphérique client.

Profils non standard

Vous pouvez créer des applications serveur et client en utilisant la technologie BluetoothLE sans avoir recours aux profils GATT, c'est-à-dire que vous pouvez créer vos propres services et caractéristiques pour une communication privée entre les périphériques serveur et client. 
L'utilisation d'un profil non standard requiert un UUID 128 bits qui doit être généré de façon aléatoire.
Chaque périphérique Bluetooth LE se comportant comme un serveur GATT doit implémenter le service Generic Access (Accès générique) officiel avec les caractéristiques Device Name (nom du périphérique) et Appearance (apparence). Pour plus d'informations, consultez la page officielle : service Generic Access (EN).

Ajout de la prise en charge de l'exécution en arrière-plan sur iOS

Si votre application iOS requiert que des services continuent leur exécution en arrière-plan, vous devez spécifier avant de déployer votre application finale les valeurs de la clé UIBackgroundModesProject dans la page Informations de version.
Remarque: Si vous devez réveiller votre application lorsqu'un événement Bluetooth se produit, ajoutez les valeurs de chaînes suivantes à la clé UIBackgroundModesProject :
  • bluetooth-central : si votre application assume le rôle central.
  • bluetooth-peripherical : si votre application joue un rôle périphérique.
Pour plus d'informations, voir Core Bluetooth Background Processing for iOS Apps (EN).

Voir aussi