Utilisation de BeaconFence

De IoT
Aller à : navigation, rechercher

Aller au parent BeaconFence


Plates-formes prises en charge

Plate-forme Prise en charge ?

Windows

10+

Mac OS X

YesSubscriptionFeature.png

iOS

YesSubscriptionFeature.png

Simulateur iOS

Android

YesSubscriptionFeature.png

Paramètres BeaconFence

Avant d'utiliser BeaconFence, le package BeaconFence doit être installé.

Vous pouvez ensuite inclure :

  • Un composant TBeaconMapFencing.
  • Un composant TBeaconZonesFencing.
  • Une combinaison des deux.
Remarque : Le composant TBeaconZonesFencing ne doit pas contenir l'éditeur de carte BeaconFence visuel. Ce composant a été conçu pour la gestion des événements de proximité.

Vous devez ensuite activer le composant pour démarrer le processus de délimitation :

BeaconMapFencing.Enabled := True;
BeaconZonesFencing.Enabled := True;

Vous pouvez ensuite spécifier des valeurs spécifiques pour les propriétés TBeaconManagerOptions associées aux beacons de votre projet cartographique. Nous vous recommandons d'utiliser l'inspecteur d'objets. Pour plus d'informations, voir Propriétés TBeaconManager et Utilisation des beacons.

BeaconManagerOptions.png

Ajout de services de localisation

TBeaconMapFencing et TBeaconZonesFencing nécessitent l'activation des services de localisation afin d'accéder aux informations basées sur la localisation depuis votre périphérique. Pour activer ce service, vous devez suivre la procédure identique expliquée pour les beacons dans Ajout de services de localisation.

Remarque : Facultativement, vous pouvez aussi permettre à votre application iOS de s'exécuter en arrière-plan afin que le périphérique BLE se réveille pour gérer les événements Bluetooth associés aux beacons en mode standard ou en mode alternatif. Pour cela, vous devez ajouter la prise en charge des modes d'exécution en arrière-plan Core Bluetooth en incluant la valeur requise dans la clé UIBackgroundModes du fichier Info.plist de votre projet.

  1. Dans l'EDI : Fichier > Projet > Options > Informations de version.
  2. Sélectionnez la clé UIBackgroundModes.
  3. Introduisez la valeur bluetooth-central.

Paramètres de carte

Pour définir un projet cartographique dans votre application, vous devez :

  • Définir la propriété PainControl sur le contrôle qui affichera la carte dans votre application.

Vous pouvez ensuite choisir entre les deux alternatives suivantes :

  1. Utiliser l'éditeur de carte BeaconFence visuel.
  2. Utiliser les données d'un XMLMap au format XML pour :
  • Charger manuellement un projet cartographique avec LoadProjectFromXML.
  • Enregistrer manuellement un projet cartographique avec SaveProjectToXML.
  • Définir manuellement un projet cartographique avec SetXmlData.

Dès que vous disposez d'un projet cartographique, si vous souhaitez contrôler ses informations et gérer les éventuels changements, vous pouvez utiliser :

  • L'événement OnBeforeMapChange pour gérer des actions personnalisées avant un changement de la carte.
  • La propriété ProjectInformation : elle sert à accéder à toutes les informations disponibles sur les éléments en cours dans XMLMap. Cette propriété contient des informations sur :
    • Les régions à contrôler (BeaconMapFencing1.ProjectInformation.RegionsToMonitorize).
    • La liste des points d'intérêt (BeaconMapFencing1.ProjectInformation.PoiList).
    • Les cartes (BeaconMapFencing1.ProjectInformation.Maps).
      • Les zones de chaque carte (BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J]).
      • La position de chaque zone d'une carte :
        • BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Left.
        • BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Top.
        • BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Right.
        • BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Bottom.
      • La liste des beacons de chaque carte (BeaconMapFencing1.ProjectInformation.Maps[I].BeaconList[J]).
    • Les chemins et leurs noeuds (BeaconMapFencing1.ProjectInformation.GlobalPath[I].Node).

Par exemple, pour obtenir une liste des beacons de chaque carte et des informations sur chacun des beacons, utilisez l'extrait de code suivant 

Delphi :
var
  LInformation: TFencingProject;
  I: Integer;
  J: Integer;
  LMapCount: Integer;
  LLine: string;
  MmMapsInformation: TMemo;
begin
  LInformation := BeaconMapFencing1.ProjectInformation;
  LMapCount := Length(LInformation.Maps);
  for I := 0 to LMapCount - 1 do
    begin
      LLine := 'Map: ' + LInformation.Maps[I].Map.Name + ' Size: ' + FormatFloat('0.00', LInformation.Maps[I].Map.GetGlobalRect.Width) + '-' +
        FormatFloat('0.00', LInformation.Maps[I].Map.GetGlobalRect.Height);
      MmMapsInformation.Lines.Add(LLine);
      MmMapsInformation.Lines.Add('  Beacon List: ');
      for J := 0 to Length(LInformation.Maps[I].BeaconList) - 1 do
      begin
        LLine := '     ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.Name;
        LLine := LLine  + ' Position : (' + FormatFloat('0.00', LInformation.Maps[I].BeaconList[J].DesignBeacon.CenterInGlobalSpace.X) + '-' +
          FormatFloat('0.00', LInformation.Maps[I].BeaconList[J].DesignBeacon.CenterInGlobalSpace.Y) + ')';
        MmMapsInformation.Lines.Add(LLine);
        LLine := '      BeaconType' + Integer(LInformation.Maps[I].BeaconList[J].DesignBeacon.KindofBeacon).ToString
          + 'GUID' + LInformation.Maps[I].BeaconList[J].DesignBeacon.GUID.ToString
          + ' Major: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.Major.ToString
          + ' Minor: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.Minor.ToString
          + ' EddyNamespace: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.EddyNamespace
          + ' EddyInstance: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.EddyInstance;
        MmMapsInformation.Lines.Add(LLine);
      end;
    end;
end
C++ :
TFencingProject LInformation;
Integer I;
Integer J;
Integer LMapCount;
String LLine;
TMemo *MmMapsInformation;

LInformation = BeaconMapFencing1->ProjectInformation;
LMapCount = LInformation.Maps.Length;
for (I = 0; I < LMapCount; I++) {
  LLine = "Map: " + LInformation.Maps[I].Map->Name + " Size: " + FormatFloat("0.00", LInformation.Maps[I].Map->GetGlobalRect().Width()) + "-" +
    FormatFloat("0.00", LInformation.Maps[I].Map->GetGlobalRect().Height());
  MmMapsInformation->Lines->Add(LLine);
  MmMapsInformation->Lines->Add("  Beacon List: ");
  for (J = 0; J < LInformation.Maps[I].BeaconList.Length; J++) {
    LLine = "     " + LInformation.Maps[I].BeaconList[J].DesignBeacon->Name;
    LLine = LLine  + " Position : (" + FormatFloat("0.00", LInformation.Maps[I].BeaconList[J].DesignBeacon->CenterInGlobalSpace.X) + "-" +
      FormatFloat("0.00", LInformation.Maps[I].BeaconList[J].DesignBeacon->CenterInGlobalSpace.Y) + ")";
    MmMapsInformation->Lines->Add(LLine);
    LLine = "      BeaconType" + IntToStr(Integer(LInformation.Maps[I].BeaconList[J].DesignBeacon->KindofBeacon))
      + "GUID" + GUIDToString(LInformation.Maps[I].BeaconList[J].DesignBeacon->GUID)
      + " Major: " + IntToStr(LInformation.Maps[I].BeaconList[J].DesignBeacon->Major)
      + " Minor: " + IntToStr(LInformation.Maps[I].BeaconList[J].DesignBeacon->Minor)
      + " EddyNamespace: " + LInformation.Maps[I].BeaconList[J].DesignBeacon->EddyNamespace
      + " EddyInstance: " + LInformation.Maps[I].BeaconList[J].DesignBeacon->EddyInstance;
    MmMapsInformation->Lines->Add(LLine);
  };
};

Pour plus d'informations sur la propriété ProjectInformation, voir la fonction ShowProjectInformation dans l'exemple FencingGeneric des démos BeaconFence.

Options de carte

Vous pouvez maintenant utiliser BeaconManagerOptions pour changer les options visuelles TFencingMapOption suivantes de la carte en cours à l'exécution :

  • ColorBeacon : Affiche les beacons avec des couleurs différentes selon la valeur de la proximité.
Niveau Couleur
Intermédiaire Vert
Proche Jaune
Loin Orange
Très loin Rouge
  • HighlightZones : Change la valeur de l'opacité de la zone active.
  • ShowPosition : Dessine la position estimée du périphérique BLE dans la carte.
  • ShowPositionInPath : Dessine une position estimée redéfinie qui correspond au chemin le plus court.
  • ShowBeacons : Affiche les beacons que vous avez définis sur la carte.
  • ShowBeaconSignal : Dessine des cercles centrés sur les beacons qui indiquent la distance en cours jusqu'au périphérique BLE. La distance est calculée à partir des valeurs rssi.
  • ShowZones : Affiche les zones que vous avez définies sur la carte.
  • ShowPaths : Affiche les chemins que vous avez définis sur la carte.

Evénements de proximité

  • OnBeaconEnter : Déclenché lorsqu'un nouveau beacon est détecté à une distance accessible.
  • OnBeaconExit : Déclenché lorsqu'un beacon n'est plus détecté à une distance accessible.
  • OnBeaconProximity : Déclenché à chaque fois que la valeur de la proximité change.

Evénements de zone

  • OnZoneEnter : Déclenché lorsque la position calculée se trouve à l'intérieur d'une zone définie.
  • OnZoneExit : Déclenché lorsque la position calculée quitte une zone définie.
  • OnZoneBeaconEnter : Déclenché lorsqu'un beacon préalablement défini dans une zone entre dans cette zone.
  • OnZoneBeaconExit : Déclenché lorsqu'un beacon préalablement défini dans une zone quitte cette zone.
  • OnZoneOnBeaconProximity : Déclenché à chaque fois que la valeur de la proximité d'un beacon défini dans une zone change.

Remarque : En plus de ces événements basés sur la position, vous pouvez aussi recenser des régions à contrôler par UUID, Major et Minor. Utilisez l'éditeur de carte BeaconFence pour ajouter et configurer des beacons à contrôler. Pour plus d'informations, voir Utilisation des beacons.

Calcul de la position

L'API BeaconFence fournit l'unité System.Beacon.Fencing.PositionCalculator, où vous trouverez les classes nécessaires utilisées pour estimer la position en cours de votre périphérique BLE dans une carte spécifique.

L'implémentation par défaut de TPositionCalculator incorpore les fonctionnalités principales d'un algorithme de filtre particulaire optimisé pour les tâches relatives à la localisation. En particulier, ce filtre particulaire correspond à un algorithme de localisation Monte-Carlo (EN).

Localisation Monte-Carlo

L'algorithme de localisation Monte-Carlo est implémenté dans TTrilateration et il extrait les mesures de distance entre votre périphérique BLE et plusieurs beacons de la carte. Il utilise ensuite ces distances pour calculer la position estimée du périphérique BLE par le biais d'une technique Trilateration.

Utilisez les propriétés suivantes pour optimiser les paramètres d'options du filtre particulaire :

  • ParticlesNumber : Nombre de particules qui représentent une distribution gaussienne pour les calculs statistiques. Un grand nombre de particules produit des estimations précises au détriment de nombreux calculs. Trouvez un compromis basé sur les ressources de votre périphérique.
  • UpdateInterval : Intervalle de temps en millisecondes utilisé pour estimer des positions consécutives.
  • MovementStDeviation : Déviation standard utilisée pour rendre aléatoire la distribution des particules.
  • SignalRelativeStdDev : Déviation standard utilisée pour représenter le rapport signal sur erreur lors du traitement des calculs de distances.
  • BeaconsToUse : Nombre de beacons utilisés pour calculer les mesures de distance. TTrilateration effectue la trilatération avec ces distances afin de fournir la position estimée finale.
  • OwnsCalcDistance : Définissez cette propriété sur true pour activer l'implémentation par défaut de TPositionCalculator afin de calculer la distance jusqu'aux beacons.
  • AutomaticCalibration : Définissez cette propriété sur true pour activer l'implémentation par défaut de TPositionCalculator afin d'effectuer la calibration automatique pour les beacons.
  • MotionThreshold : Valeur de seuil qui détermine quand le périphérique BLE se déplace.

Récupération de la position estimée

Vous pouvez utiliser les événements suivants afin de récupérer la position estimée de votre périphérique BLE :

  • OnEstimatingPosition : Déclenché lorsque la position est estimée.
  • OnCalcPosition : Déclenché avant le calcul de la position.
  • OnPositionEstimated : Déclenché lorsque la position calculée change.

Implémentation redéfinie

System.Beacon.Fencing.PositionCalculator inclut des classes abstraites que vous pouvez redéfinir afin d'implémenter votre conception personnalisée pour le calculateur de position. A cette fin, vous devez redéfinir les méthodes d'un objet de type TPositionCalculatorClass.

Remarque : Utilisez la propriété OnEstimatingPosition pour récupérer l'estimation de la position en cours à l'exécution.

Calcul des routes

L'API BeaconFence fournit l'unité System.Beacon.Fencing.PathFinder, où vous trouverez une implémentation de l'algorithme de Dijkstra (EN) pour le calcul de la route la plus courte à partir de la position estimée en cours de votre périphérique BLE (point initial) jusqu'à un point d'intérêt désiré (point de destination) dans votre carte.

Pour exploiter cette fonctionnalité à des fins de navigation, vous devez :

  1. Ajouter et configurer des chemins et des noeuds afin que votre carte contienne des chemins prédéfinis qui se connectent à tous les points d'intérêt disponibles.
  2. Appeler TCustomBeaconMapFencing.ShowPathToNodeIndex pour obtenir la route la plus courte jusqu'au point de destination. Cette méthode sélectionne et affiche le chemin le plus court disponible dans votre carte.

Voir aussi