Utilisation des beacons

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation du Bluetooth


Un beacon (ou balise) est un périphérique Bluetooth Low Energy. Il intègre des informations dans ses données publicitaires, en particulier les données spécifiques au fabricant ("Manufacturer Specific Data") décrites dans "Bluetooth Specification Version 4.1, page 2023 (EN)" https://www.bluetooth.org/en-us. Grâce à ces informations, n'importe quel périphérique Bluetooth Low Energy se trouvant à proximité peut identifier le beacon et calculer la distance qui les sépare, sans qu'il soit nécessaire de les appairer ni d'établir une connexion.

Présentation des beacons

Prise en charge des plates-formes

Plate-forme Prise en charge

Windows(*)

10+

macOS

10.7+

iOS

5+

Android

4.3+

Remarque: Utilisation de la RTL (bibliothèque d'exécution) L'API RTL des beacons est disponible seulement pour les plates-formes Windows 10+. Les deux formats disponibles sont iBeacon et AltBeacon. Les versions précédentes de Windows ne prennent pas en charge les publicités BLE.

Types de beacons

Trois formats de beacons sont disponibles : iBeacon, AltBeacon et Eddystone. L'API des beacons RTL les différencie en utilisant les types TBeaconScanMode et TKindofBeacon.

Vous devez connaître le format utilisé pour le beacon que vous souhaitez surveiller.

Format de beacon Description Mode

iBeacon

Format défini par Apple. Les spécifications complètes sont disponibles ici (EN).

Standard

AltBeacon

Format ouvert. Les spécifications complètes sont disponibles ici (EN).

Alternatif

Eddystone

Format ouvert défini par Google. Les spécifications complètes sont disponibles ici (EN).

Eddystone

Informations sur le fabricant

Les périphériques Bluetooth Low Energy en mode publicité envoient à maintes reprises les données publicitaires par voie radio sous la forme de différentes structures de type AD. L'un des types AD des données publicitaires est le type Manufacturer Specific Data qui est utilisé par les beacons. En fonction du format de beacon, les données incluses dans le "Manufacturer Specific Data" sont différentes.

Le tableau suivant montre les champs de données que chaque beacon peut diffuser :

Données promues Description iBeacon AltBeacon Eddystone

UUID

Un identificateur unique qui identifie un groupe de beacons, par exemple les beacons d'une entreprise spécifique.

Checkmark.svg
Checkmark.svg
Checkmark.svg

Major

L'ID Major identifie une sous-région au sein d'une région plus étendue définie par un UUID.

Checkmark.svg
Checkmark.svg

Minor

L'ID Minor spécifie une sous-division supplémentaire au sein d'un ID Major.

Checkmark.svg
Checkmark.svg

TxPower

TxPower est la puissance mesurée en dBm à 1 mètre de distance du beacon. La distance approximative d'un beacon peut être calculée à l'aide de TxPower et du RSSI (Received Signal Strength Indicator).

Checkmark.svg
Checkmark.svg
Checkmark.svg

Trame Eddystone

La trame Eddystone contient un UUID de service qui est connu en tant que ServiceData, ayant l'ID 0xFEAA.

La trame accepte trois sous-formats :

Pour de plus amples informations, voir Eddystone specifications (EN).

Mode d'emploi des beacons

L'API RTL des beacons vous permet d'obtenir la distance entre le périphérique qui utilise votre application et les beacons environnants. L'API RTL des beacons fournit des informations uniquement pour les beacons se trouvant dans la région définie. Une région est un groupe de beacons. Vous pouvez spécifier une région avec ses propriétés UUID, MajorID, MinorID (pour iBeacons et AltBeacons) ou avec ses identifiants Namespace et Instance (pour Eddystone).

Obtention d'une instance de TBeaconManager

Pour utiliser l'API RTL des beacons, vous devez inclure l'unité System.Beacon dans votre application, puis appeler TBeaconManager.GetBeaconManager pour le TBeaconScanMode qui sera utilisé pour obtenir une instance de TBeaconManager.

Pour iBeacons :

 BeaconManager := TBeaconManager.GetBeaconManager(TBeaconScanMode.Standard);

Pour AltBeacons :

 BeaconManager := TBeaconManager.GetBeaconManager(TBeaconScanMode.Alternative);

Pour Eddystone :

 BeaconManager := TBeaconManager.GetBeaconManager(TBeaconScanMode.Eddystone);

Pour Extended :

 BeaconManager := TBeaconManager.GetBeaconManager(TBeaconScanMode.Extended);

La propriété ScanMode identifie le type de beacon que le système doit rechercher : mode standard (Standard), mode alternatif (Alternative), mode Eddystone (Eddystone) ou mode étendu (Extended). Le mode Extended vous permet de rechercher plusieurs types de beacons simultanément. TBeaconManager est la classe principale de l'implémentation beacon de l'API RTL des beacons. TBeaconManager est responsable du recensement des régions et gère les événements pour obtenir les informations à partir des beacons. L'instance TBeaconManager doit être créée pour le mode Standard, le mode Alternative ou le mode Eddystone.

Recensement des régions à surveiller

Utilisez la méthode TBeaconManager.RegisterBeacons pour recenser les régions des beacons que vous souhaitez surveiller. Vous devez transmettre un paramètre ayant le type TBeaconsRegion pour spécifier les informations sur le beacon et la région.

 BeaconManager.RegisterBeacons(ABeaconRegion);

Pour iBeacons et AltBeacons :

  • Le paramètre de type TBeaconsRegion est défini en tant que TiBAltBeaconRegion.
  • Les régions sont spécifiées avec les paramètres UUID, MajorID et MinorID. Pour recenser une région, seul le paramètre UUID est requis. Si vous souhaitez être plus spécifique concernant la région à recenser, vous pouvez utiliser MajorID, MinorID ou les deux.

Pour Eddystone :

Analyse des beacons

Pour les beacons recensés : Le framework précédent nécessite que vous :

  1. Recensez les beacons que vous souhaitez surveiller.
  2. Démarrez la surveillance des beacons recensés.
  3. Arrêtez la surveillance des beacons recensés.

Pour les beacons non recensés : La nouvelle amélioration des performances d'analyse vous permet d'analyser simultanément plusieurs types de beacons qui ne sont pas recensés :

  1. Définissez le mode étendu.
  2. Sélectionnez les formats que vous souhaitez surveiller, de type TKindofBeacon.
  3. Définissez sur la propriété ModeExtended les beacons sélectionnés pour être surveillés.
  4. Démarrez la surveillance des beacons non recensés.
  5. Arrêtez la surveillance des beacons non recensés.
Remarque: Si vous avez recensé précédemment un beacon, les dernières étapes récupèrent uniquement les beacons recensés et les beacons EddystoneURL comme les seuls beacons non recensés.

Obtention d'informations à partir des beacons entrants

Pour obtenir des informations sur un beacon, demandez à l'interface principale du beacon (IBeacon) le type de beacon qui est surveillé. Vous pouvez ensuite utiliser l'interface spécifique du beacon : IiBeacon pour iBeacon, IAltBeacon pour AltBeacon ou IEddystoneBeacon pour Eddystone.

Vous pouvez obtenir des informations concernant les beacons surveillés via les événements associés au TBeaconManager. Chaque format de beacon fournit un ensemble spécifique d'événements :

  1. Pour iBeacons et AltBeacons :
    • OnCalcDistance : déclenché immédiatement avant le calcul de la distance.
    • OnEnterRegion : déclenché la première fois qu'un beacon devient accessible à partir d'une région recensée.
    • OnExitRegion : déclenché lorsque tous les beacons recensés sur une région deviennent inaccessibles.
    Une fois l'événement déclenché, vous pouvez utiliser les informations fournies par l'événement.
Remarque: Du fait des exigences de compatibilité multi-plateforme, si vous recensez plusieurs éléments de région avec le même UUID et que vous souhaitez les surveiller, vous n'obtiendrez que les événéments du dernier événement de région recensé dans TBeaconRegionCollection. Dans l'éventualité où vous souhaiteriez surveiller différentes régions, il existe deux façons de faire selon votre scénario :
  • Recensez une région avec son UUID spécifique, MajorID = -1 et MinorID = -1 afin de recevoir les événements associés à l'ensemble des beacons ayant le même UUID.
  • Recensez une région avec son UUID spécifique et concevez votre app de façon à filtrer MajorID et MinorID selon vos valeurs personnalisées et les exigences relatives à votre app.
  1. For Eddystone:
  2. Pour tout format de beacon :
    • OnCalculateDistances : déclenché immédiatement avant le calcul de la distance du beacon.
    • OnBeaconEnter : déclenché chaque fois qu'un nouveau beacon devient accessible.
    • OnBeaconsEnterRegion : déclenché chaque fois qu'un nouveau beacon est détecté dans une région. Les informations sur le beacon et la région sont spécifiées avec le type TBeaconsRegion.
    • OnBeaconExit : déclenché chaque fois qu'un beacon devient inaccessible.
    • OnBeaconsExitRegion : déclenché chaque fois qu'un beacon recensé dans une région est perdu. Les informations sur le beacon et la région sont spécifiées avec le type TBeaconsRegion.
    • OnBeaconProximity : déclenché chaque fois que la valeur Proximity change.

Exemple

L'extrait de code suivant montre comment utiliser un événement OnBeaconEnter. Pour obtenir les informations requises sur le beacon à partir de cet événement, procédez de la manière suivante :

  1. Demandez à l'interface principale du beacon le type de beacon surveillé. Pour cela, utilisez la propriété KindofBeacon.
  2. Demandez à l'interface spécifique :
  3. Code pour cet événement.
procedure TForm1.Beacon1BeaconEnter(const Sender: TObject;
          const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList);
var
   LEddyHandler: IEddystoneBeacon;
   LiBeacon: IiBeacon;
   LAltBeacon: IAltBeacon;
   ST: string;
begin
   case ABeacon.KindofBeacon of
   TKindofBeacon.iBeacons:
      if (Supports(ABeacon, IiBeacon, LiBeacon)) then
         ST := ' GUID: ' + LiBeacon.GUID.ToString;
      // code
   TKindofBeacon.AltBeacons:
      if (Supports(ABeacon, IAltBeacon, LAltBeacon)) then
         ST := ' GUID: ' + LAltBeacon.GUID.ToString;
      // code
   TKindofBeacon.Eddystones:
      if (Supports(ABeacon, IEddystoneBeacon, LEddyHandler)) then
         ST := LEddyHandler.EddystoneUID.NamespaceToString;
      // code
end;

Ajout de services de localisation

Les services de localisation permettent aux apps basées sur la localisation d'utiliser les informations des réseaux cellulaires, Wi-Fi, GPS et des beacons pour déterminer votre emplacement approximatif. Pour détecter les beacons, vous devez activer les services de localisation.

Android

Pour Android, activez les options Bluetooth dans Projet > Options > Permissions d'utilisation. Les utilisateurs peuvent avoir besoin de permissions d'utilisation pour activer l'utilisation des services de localisation dans l'application afin de détecter les beacons. Pour effectuer une demande manuelle de cette permission, procédez comme indiqué dans l'exemple suivant :

// add System.Permissions, FMX.DialogService to uses
 
	{$IFDEF ANDROID}
	  PermissionsService.RequestPermissions( ['android.permission.ACCESS_FINE_LOCATION'],
		procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
	    begin
		if (Length(AGrantResults) <> 1) or (AGrantResults[0] <> TPermissionStatus.Granted) then
			TDialogService.ShowMessage('Approval required to use location features')
	    end
	    );
	{$ENDIF}

iOS

Pour la plate-forme iOS, si le mode alternatif est activé, vous n'avez pas besoin d'activer les services de localisation. En mode standard (iBeacons), la demande d'activation de la localisation doit être acceptée lors du premier démarrage de l'app.

A partir d'iOS 8.0, si vous utilisez le mode standard, certaines clés permettant à l'application d'utiliser les services de localisation sont nécessaires pour la détection des beacons. L'EDI inclut déjà NSLocationAlwaysUsageDescription et NSLocationWhenInUseUsageDescription.

La clé à ajouter manuellement est :

  • NSLocationUsageDescription

Pour les valeurs, vous devez utiliser un message texte comme "Cette app doit pouvoir accéder aux services de localisation pour surveiller les beacons". Le système affiche ce message texte lorsqu'il accède à la configuration de l'app.

La clé peut être ajoutée dans l'EDI en sélectionnant Projet > Options > Informations de version, en cliquant avec le bouton droit sur la grille et en cliquant sur Ajouter une clé.

BeaconKeysFig1.png

Limitations en utilisation intérieure

Le signal radio diffusé par les beacons est extrêmement sensible aux effets de bruit tels que la diffraction, l'absorption, les réflexions sur plusieurs chemins ou les interférences qui proviennent d'autre périphériques émettant sur la même bande de radiofréquence. Ces effets nuisibles affectent principalement le signal du beacon dans les environnements intérieurs. En conséquence, les estimations issues des mesures de l'alimentation, comme les valeurs des propriétés Rssi, Distance ou Proximity, deviennent considérablement instables et tendent à fluctuer. La précision de ces estimations diminue donc.

Traitement du signal

La RTL fournit deux algorithmes différents pour améliorer la stabilité du signal d'un beacon et les estimations issues de ce signal :

  • RssiToDistance introduit un modèle pour obtenir l'estimation de distance dérivée des mesures Rssi. Notez qu'un paramètre d'alimentation calibré, ATxPower, améliore la fiabilité de l'algorithme.
  • TBeaconManager implémente un algorithme de filtre différentiel en option. Cet algorithme stabilise les mesures Rssi et distance. Pour activer cet algorithme, sélectionnez le mode de calcul Stabilized sur la propriété CalcMode. Ce mode est particulièrement utile pour l'estimation de la proximité et la détection de mouvements.

Imbrication d'algorithmes

Vous pouvez également incorporer des algorithmes supplémentaires de traitement du signal. Il peut s'agir d'algorithmes à usage général ou d'algorithmes conçus par vous-même. La liste suivante contient des exemples de filtres que vous pouvez implémenter pour diminuer les effets de bruit :

  • Filtre moyenne mobile
  • Filtre moyenne pondérée
  • Filtre ajustement de courbe

Voir aussi