Verwenden von BeaconFence

Aus IoT
Wechseln zu: Navigation, Suche

Go Up to BeaconFence


Plattformunterstützung

Plattform Unterstützt

Windows

10+

Mac OS X

YesSubscriptionFeature.png

iOS

YesSubscriptionFeature.png

iOS-Simulator

Android

YesSubscriptionFeature.png

BeaconFence-Einstellungen

Für die Verwendung von BeaconFence muss das BeaconFence-Package installiert sein.

Dann können Sie folgende Komponenten einbeziehen:

  • Eine TBeaconMapFencing-Komponente.
  • Eine TBeaconZonesFencing-Komponente.
  • Eine Kombination von beiden.
Hinweis: Die Komponente TBeaconZonesFencing enthält den visuellen BeaconFence-Karteneditor nicht. Diese Komponente dient der Verwaltung von Näherungsereignissen.

Anschließend müssen Sie die Komponente aktivieren, damit der Geofencing-Prozess startet:

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

Als Nächstes können Sie bestimmte Werte für die den Beacons Ihres Kartenprojekts zugeordneten TBeaconManagerOptions-Eigenschaften festlegen. Am besten verwenden Sie dazu den Objektinspektor. Weitere Informationen finden Sie unter Eigenschaften von TBeaconManager und Verwenden von Beacons.

BeaconManagerOptions.png

Hinzufügen von Positionsdiensten

Für TBeaconMapFencing und TBeaconZonesFencing müssen Sie Positionsdienste aktivieren, um von Ihrem Gerät aus auf positionsbasierte Informationen zuzugreifen. Um diesen Positionsdienst zu aktivieren, müssen Sie die für Beacons unter Hinzufügen von Positionsdiensten beschriebene Anleitung befolgen.

Hinweis: Optional können Sie Ihre iOS-Anwendung auch im Hintergrund ausführen, damit das BLE-Gerät Bluetooth-Ereignisse behandelt, die Beacons im Standardmodus oder im alternativen Modus zugeordnet sind. Dazu müssen Sie die Unterstützung für Hintergrund-Ausführungsmodi für Core Bluetooth hinzufügen, indem Sie den erforderlichen Wert in den Schlüssel UIBackgroundModes in der Datei Info.plist (EN) Ihres Projekts einfügen:

  1. In der IDE: Datei > Projekt > Optionen > Versionsinformationen.
  2. Wählen Sie den Schlüssel UIBackgroundModes.
  3. Geben Sie den Wert bluetooth-central an.

Karteneinstellungen

Um ein Kartenprojekt in Ihrer Anwendung einzurichten, müssen Sie:

  • Die Eigenschaft PainControl auf das Steuerelement setzen, mit dem die Karte in Ihrer Anwendung angezeigt werden soll.

Dann können Sie zwischen zwei Alternativen wählen:

  1. Verwenden Sie den visuellen BeaconFence-Karteneditor.
  2. Verwenden Sie Daten aus einer XMLMap im XML-Format, um folgende Aktionen manuell durchzuführen:
  • Laden eines Kartenprojekts mit LoadProjectFromXML.
  • Speichern eines Kartenprojekts mit SaveProjectToXML.
  • Festlegen eines Kartenprojekts mit SetXmlData.

Wenn Sie die Informationen eines Kartenprojekts überwachen und mögliche Änderungen verwalten möchten, können Sie:

  • Das Ereignis OnBeforeMapChange zur Verwaltung von benutzerdefinierten Aktionen vor dem Ändern einer Karte verwenden.
  • Die Eigenschaft ProjectInformation verwenden: Verwenden Sie diese Eigenschaft zum Zugreifen auf alle Informationen der aktuellen Elemente in der XMLMap. Diese Eigenschaft enthält Informationen über:
    • Die zu überwachenden Bereiche (BeaconMapFencing1.ProjectInformation.RegionsToMonitorize).
    • Die Liste der wichtigen Punkte (BeaconMapFencing1.ProjectInformation.PoiList).
    • Die Karten (BeaconMapFencing1.ProjectInformation.Maps).
      • Die Zonen auf jeder Karte (BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J]).
      • Die Position jeder Zone auf einer Karte:
        • 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.
      • Die Beacons-Liste auf jeder Karte (BeaconMapFencing1.ProjectInformation.Maps[I].BeaconList[J]).
    • Die Pfade und deren Knoten (BeaconMapFencing1.ProjectInformation.GlobalPath[I].Node).

Verwenden Sie das folgende Codefragment, um beispielsweise eine Beacon-Liste von jeder Karte und bestimmte Informationen über jeden Beacon abzurufen:

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);
  };
};

Weitere Informationen über die Eigenschaft ProjectInformation finden Sie bei der Funktion ShowProjectInformation im Beispiel FencingGeneric der BeaconFence-Demos.

Kartenoptionen

Jetzt können Sie mit BeaconManagerOptions die folgenden visuellen TFencingMapOption-Optionen der aktuellen Karte zur Laufzeit ändern:

  • ColorBeacon: Zeigt Beacons abhängig vom Näherungswert in unterschiedlichen Farben an.
Ebene Farbe
Intermediate Grün
Near Gelb
Far Orange
Away Rot
  • HighlightZones: Ändert den Opazitätswert der aktiven Zone.
  • ShowPosition: Zeichnet die berechnete Position des BLE-Geräts in die Karte.
  • ShowPositionInPath: Zeichnet die optimierte berechnete Position, die in den nächsten Pfad passt.
  • ShowBeacons: Zeigt die Beacons an, die Sie in der Karte festgelegt haben.
  • ShowBeaconSignal: Zeichnet zentrierte Kreise um die Beacons, die die aktuelle Entfernung zu dem BLE-Gerät angeben. Die Entfernung wird aus Rssi-Werten berechnet.
  • ShowZones: Zeigt die Zonen an, die Sie in der Karte festgelegt haben.
  • ShowPaths: Zeigt die Pfade an, die Sie in der Karte festgelegt haben.

Näherungsereignisse

  • OnBeaconEnter: Wird ausgelöst, wenn ein neuer Beacon in Reichweite ermittelt wird.
  • OnBeaconExit: Wird ausgelöst, wenn sich ein Beacon nicht mehr in Reichweite befindet.
  • OnBeaconProximity: Wird jedes Mal ausgelöst, wenn sich der Näherungswert ändert.

Zonenereignisse

  • OnZoneEnter: Wird ausgelöst, wenn sich die berechnete Position innerhalb einer definierten Zone befindet.
  • OnZoneExit: Wird ausgelöst, wenn die berechnete Position eine definierte Zone verlässt.
  • OnZoneBeaconEnter: Wird ausgelöst, wenn ein zuvor in einer Zone definierter Beacon in eine derartige Zone eintritt.
  • OnZoneBeaconExit: Wird ausgelöst, wenn ein zuvor in einer Zone definierter Beacon eine derartige Zone verlässt.
  • OnZoneOnBeaconProximity: Wird jedes Mal ausgelöst, wenn sich der Näherungswert für einen in einer Zone definierten Beacon ändert.

Hinweis: Außer diesen positionsbasierten Ereignissen können Sie auch Regionen registrieren, die von UUID, Major und Minor überwacht werden sollen. Mit dem BeaconFence-Karteneditor können Sie zu überwachende Beacons hinzufügen und konfigurieren. Weitere Informationen finden Sie unter Verwenden von Beacons.

Berechnen der Position

Die Unit System.Beacon.Fencing.PositionCalculator der API für BeaconFence enthält die erforderlichen Klassen zum Berechnen der aktuellen Position Ihres BLE-Geräts auf einer bestimmten Karte.

Die Standardimplementierung von TPositionCalculator integriert die Hauptfunktionen eines für Lokalisierungsaufgaben optimierten Partikel-Filteralgorithmus (EN). Dieser Partikel-Filter entspricht einem Monte-Carlo-Lokalisierungsalgorithmus (EN).

Monte-Carlo-Lokalisierung

Der Monte-Carlo-Lokalisierungsalgorithmus ist in TTrilateration implementiert und extrahiert die Entfernungsmessungen von Ihrem BLE-Gerät zu mehreren Beacons auf der Karte. Dann wird mit diesen Entfernungen die Position des BLE-Geräts anhand einer Trilateration (EN)-Technik berechnet.

Mit den folgenden Eigenschaften können Sie die Optionsparameter des Partikel-Filters einstellen:

  • ParticlesNumber: Anzahl der Partikel, die eine Gaußschen Normalverteilung für statistische Berechnungen darstellen. Eine große Anzahl von Partikeln liefert genaue Berechnungen auf Kosten der Berechnungsdauer. Finden Sie einen Kompromiss auf Basis der Ressourcen Ihres Geräts.
  • UpdateInterval: Zeitintervall in Millisekunden zur Berechnung aufeinanderfolgender Positionen.
  • MovementStDeviation: Standardabweichung zur zufälligen Anordnung der Verteilung der Partikel.
  • SignalRelativeStdDev: Standardabweichung zur Darstellung des Signals zum Fehlerverhältnis bei Entfernungsberechnungen.
  • BeaconsToUse: Anzahl der zur Berechnung der Entfernungsmessungen verwendeten Beacons. TTrilateration führt dann eine Trilateration mit diesen Entfernungen durch, um die endgültige berechnete Position bereitzustellen.
  • OwnsCalcDistance: Setzen Sie diese Eigenschaft auf true, um die Standardimplementierung von TPositionCalculator zur Berechnung der Entfernung zu den Beacons zu aktivieren.
  • AutomaticCalibration: Setzen Sie diese Eigenschaft auf true, um die Standardimplementierung von TPositionCalculator zum Durchführen einer automatischen Kalibrierung für die Beacons zu aktivieren.
  • MotionThreshold: Schwellenwert, der feststellt, wann das BLE-Gerät bewegt wird.

Abrufen der Positionsberechnung

Sie können mit den folgenden Ereignissen die berechnete Position Ihres BLE-Geräts abrufen:

  • OnEstimatingPosition: Wird ausgelöst, wenn die Position berechnet wird.
  • OnCalcPosition: Wird ausgelöst, bevor die Position berechnet wird.
  • OnPositionEstimated: Wird ausgelöst, wenn sich die berechnete Position ändert.

Benutzerdefinierte Implementierung

System.Beacon.Fencing.PositionCalculator enthält abstrakte Klassen, die Sie zur Implementierung Ihres eigenen Entwurfs für die Positionsberechnung überschreiben können. Zu diesem Zweck müssen Sie die Methoden in einem Objekt mit dem Typ TPositionCalculatorClass überschreiben.

Hinweis: Mit der Eigenschaft OnEstimatingPosition rufen Sie die Berechnung der aktuellen Position zur Laufzeit ab.

Berechnen von Routen

Die Unit System.Beacon.Fencing.PathFinder der API für BeaconFence enthält eine Implementierung des Dijkstra-Algorithmus (EN) zum Berechnen der kürzesten Route von der aktuellen berechneten Position Ihres BLE-Geräts (Ausgangspunkt) zu einem gewünschten wichtigen Punkt (Zielpunkt) auf Ihrer Karte.

Um diese Funktion für Navigationszwecke zu nutzen, müssen Sie:

  1. Pfade und Knoten hinzufügen und konfigurieren, damit Ihre Karte vordefinierte Pfade enthält, die alle verfügbaren wichtigen Punkte verbindet.
  2. TCustomBeaconMapFencing.ShowPathToNodeIndex aufrufen, um die kürzeste Route zum Zielpunkt zu ermitteln. Diese Methode wählt den kürzesten auf Ihrer Karte verfügbaren Pfad aus und zeigt ihn an.

Siehe auch