Verwenden von Beacons

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Verwenden von Bluetooth


Ein Beacon ist ein Bluetooth Low Energy-Gerät, das Information in seinen Bekanntgabedaten enthält, insbesondere in den Manufacturer Specific Data (Herstellerspezifische Daten), die in "Bluetooth Specification Version 4.1, Seite 2023" https://www.bluetooth.org/en-us (EN) beschrieben sind. Diese Informationen ermöglichen Bluetooth Low Energy-Geräten in der Umgebung, das Gerät zu identifizieren und die Entfernung dazu zu berechnen, ohne dass eine Koppelung oder die Einrichtung einer Verbindung erfolgen muss.

Übersicht über Beacons

Plattformunterstützung

Plattform Unterstützt

Windows(*)

10+

macOS

10.7+

iOS

5+

Android

4.3+

Hinweis: Die RTL-API für Beacons ist nur für Windows 10+-Plattformen verfügbar. Die beiden verfügbaren Formate sind iBeacon und AltBeacon. Frühere Windows-Versionen unterstützen keine BLE-Werbung.

Beacon-Typen

Es sind drei Beacon-Typen verfügbar: iBeacon, AltBeacon und Eddystone. Die RTL- API für Beacons unterscheidet diese mithilfe der Typen TBeaconScanMode und TKindofBeacon.

Sie müssen das Format kennen, das der Beacon verwendet, den Sie überwachen möchten.

Beacon-Format Beschreibung Modus

iBeacon

Das von Apple definierte Format. Die vollständige Spezifikation finden Sie hier (EN).

Standard

AltBeacon

Offenes Format. Die vollständige Spezifikation finden Sie hier (EN).

Alternative

Eddystone

Von Google definiertes, offenes Format. Die vollständige Spezifikation finden Sie hier (EN).

Eddystone

Herstellerinformationen

Bluetooth Low Energy-Geräte im Bekanntgabemodus senden wiederholt die Bekanntgabedaten in verschiedenen Strukturen vom Typ AD. Einer der AD-Typen in den Bekanntgabedaten sind die herstellerspezifischen Daten, die mit Beacons verwendet werden. Abhängig vom Beacon-Format sind die in den herstellerspezifischen Daten beinhalteten Daten unterschiedlich.

Die folgende Tabelle enthält die Datenfelder, die jedes Beacon-Format bekanntgeben kann:

Bekanntgegebene Daten Beschreibung iBeacon AltBeacon Eddystone

UUID

Ein eindeutiger Bezeichner, der eine Gruppe von Beacons kennzeichnet, z. B. die Beacons für eine bestimmte Firma.

Checkmark.svg
Checkmark.svg
Checkmark.svg

Major

Die Major-ID bezeichnet einen Unterbereich in einem größeren durch die UUID festgelegten Bereich.

Checkmark.svg
Checkmark.svg
     Minor

Die Minor-ID gibt einen weiteren Unterbereich in einer Major-ID an.

Checkmark.svg
Checkmark.svg
     TxPower

Die TxPower ist die gemessene Leistung in 1 Meter Entfernung. Mit TxPower und dem Indikator für die Stärke des empfangenen Signals (Received Signal Strength Indicator, RSSI) wird die ungefähre Entfernung zu einem Beacon berechnet.

Checkmark.svg
Checkmark.svg
Checkmark.svg

Eddystone-Frame

Der Eddystone-Frame enthält eine Service-UUID, die als ServiceData mit der ID 0xFEAA bezeichnet wird.

Der Frame akzeptiert drei Unterformat:

Weitere Informationen finden Sie unter Eddystone specifications (EN).

Verwenden von Beacons

Mit der RTL-API für Beacons können Sie den Abstand zwischen dem Gerät, auf dem Ihre Anwendung ausgeführt wird, und den Beacons in der Umgebung ermitteln. Die RTL-API für Beacons stellt nur Informationen für die Beacons in einem bestimmten Bereich bereit. Bereich ist eine Gruppe von Beacons. Sie können einen Bereich mit UUID, MajorID, MinorID (für iBeacons und AltBeacons) oder Namespace und Instance (für Eddystone).

Abrufen einer Instanz von TBeaconManager

Für die Verwendung der RTL-API für Beacons müssen Sie die Unit System.Beacon in Ihre Anwendung einbeziehen und TBeaconManager.GetBeaconManager für den gewünschten TBeaconScanMode aufrufen, um eine Instanz von TBeaconManager abzurufen.

Für iBeacons:

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

Für AltBeacons:

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

Für Eddystone:

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

Für Extended:

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

Der ScanMode bezeichnet den Typ des Beacon, nach dem das System suchen soll: Standardmodus, alternativer Modus, Eddystone-Modus oder Extended-Modus. Mit dem Extended-Modus können Sie nach Beacon-Arten gleichzeitig suchen. TBeaconManager ist die Hauptklasse der Beacon-Implementierung der RTL-API für Beacons. TBeaconManager ist für die Registrierung von Bereichen zuständig und verwaltet die Ereignisse zum Abrufen von Informationen von den Beacons. Die TBeaconManager-Instanz muss entweder für den Standardmodus, den alternativen Modus oder den Eddystone-Modus erstellt werden.

Registrieren der zu überwachenden Bereiche

Mit der TBeaconManager.RegisterBeacons-Methode können Sie die Bereiche der Beacons registrieren, die Sie überwachen möchten. Sie müssen einen Parameter mit einem TBeaconsRegion-Typ überreichen, um die Informationen zum Beacon und dem Bereich anzugeben.

 BeaconManager.RegisterBeacons(ABeaconRegion);

Für iBeacons und AltBeacons:

  • Der TBeaconsRegion-Typparameter ist auf TiBAltBeaconRegion gesetzt.
  • Bereiche sind mit den Parametern UUID, MajorID und MinorID angegeben. Zum Registrieren einer Region wird nur der Parameter UUID benötigt. Falls Sie den Bereich, den Sie registrieren möchten, genauer angeben möchten, können Sie auch MajorID, MinorID oder beide verwenden.

Für Eddystone:

Suchen von Beacons

Für registrierte Beacons: Das frühere Framework setzte Folgendes voraus:

  1. Registrieren der zu überwachenden Beacons.
  2. Beginnen der Überwachung der registrierten Beacons.
  3. Beenden der Überwachung der registrierten Beacons.

Für nicht registrierte Beacons: Die Neuerungen des Suchvorgangs ermöglichen es, gleichzeitig nach verschiedenen nicht registrierten Beacon-Arten zu suchen:

  1. Legen Sie den Modus Extended fest.
  2. Wählen Sie die zu überwachenden Formate mit dem Typ TKindofBeacon aus.
  3. Setzen Sie die zu überwachenden Beacons auf die Eigenschaft ModeExtended.
  4. Beginnen Sie die Überwachung nicht registrierter Beacons.
  5. Beenden Sie die Überwachung nicht registrierter Beacons.
Hinweis: Falls Sie zuvor ein Beacon registriert haben, werden in den letzten Schritten nur registrierte Beacons abgerufen sowie EddystoneURL-Beacons als die einzigen nicht registrierten.

Abrufen von Informationen von eingehenden Beacons

Für weitere Informationen fragen Sie den Hauptbeacon-Schnittstelle (IBeacon) zur Art des Beacons, der überwacht wird. Dann können Sie die bestimmte Beacon-Schnittstelle verwenden: IiBeacon für iBeacon, IAltBeacon für AltBeacon oder IEddystoneBeacon für Eddystone.

Mit den Ereignissen, die mit TBeaconManager assoziiert sind, erhalten Sie weitere Informationen über die überwachten Beacons. Jedes Beaconformat stellt eine Gruppe von Ereignissen bereit:

  1. Für iBeacons und AltBeacons:
    • OnCalcDistance: Wir sofort ausgelöst, bevor die Entfernung (Distance) errechnet wird.
    • OnEnterRegion: Wird ausgelöst, wenn ein Beacon zum ersten Mal aus einem registrierten Bereich erreichbar ist.
    • OnExitRegion: Wird ausgelöst, wenn alle registrierten Beacons in einem Bereich unerreichbar sind.
    Nach Auslösen des Ereignisses können Sie die von dem Ereignis bereitgestellten Informationen verwenden.
Hinweis: Wenn Sie mehrere Bereichseinträge mit derselben UUID registrieren und Sie diese überwachen möchten, können Sie aufgrund plattformübergreifender Anforderungen nur Ereignisse des letzten Bereichseintrags, den Sie in der TBeaconRegionCollection registriert haben, abrufen. Wenn Sie verschiedene Bereiche überwachen möchten, können Sie abhängig von Ihrem Szenario eine der beiden folgenden Vorgehensweisen anwenden:
  • Registrieren Sie einen Bereich mit dessen spezifischer UUID, MajorID = -1 und MinorID = -1, um Ereignisse zu erhalten, die allen Beacons mit derselben UUID zugeordnet sind.
  • Registrieren Sie einen Bereich mit dessen spezifischer UUID, und entwickeln Sie Ihre App so, dass MajorID und MinorID Ihren benutzerdefinierten Werten und App-Anforderungen entsprechend gefiltert werden.
  1. For Eddystone:
  2. Für jedes Beacon-Format:
    • OnCalculateDistances: Wird kurz vor der Berechnung der Distanz zu einem Beacon ausgelöst.
    • OnBeaconEnter: Wird jedes Mal ausgelöst, wenn eine neuer Beacon erreichbar ist.
    • OnBeaconsEnterRegion: Wird jedes Mal ausgelöst, wenn ein neuer Beacon in einem Bereich erkannt wird. Die Beacon- und Bereichsinformationen werden beide mit dem TBeaconsRegion-Typ angegeben.
    • OnBeaconExit: Wird jedes Mal ausgelöst, wenn ein Beacon unerreichbar wird.
    • OnBeaconsExitRegion: Wird jedes Mal ausgelöst, wenn ein registrierter Beacon in einem Bereich nicht mehr vorhanden ist. Beacon- und Bereichsinformationen werden mit dem TBeaconsRegion-Typ angegeben.
    • OnBeaconProximity: Wird jedes Mal ausgelöst, wenn sich der Proximity-Wert ändert.

Beispiel

Das folgende Codefragment zeigt, wie ein OnBeaconEnter-Ereignis verwendet wird. Um die benötigten Beaconinformationen von diesem Ereignis zu erhalten, folgen Sie den folgenden Schritten:

  1. Fragen Sie die Beacon-Schnittstelle zur Art des überwachten Beacons. Verwenden Sie aus diesem Grund die KindofBeacon-Eigenschaft.
  2. Fragen Sie nach der bestimmten Schnittstelle:
  3. Code für dieses Ereignis.
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;

Hinzufügen von Positionsdiensten

Positionsdienste ermöglichen, positionsbasierten Apps anhand von Informationen von Mobiltelefonen, WiFi, GPS und Beacons Ihren ungefähren Standort zu ermitteln. Zur Ermittlung von Beacons müssen Sie die Positionsdienste aktivieren.

Android

Für Android müssen Sie die Bluetooth-Optionen in Projekt > Optionen > Verwendet Berechtigungen aktivieren.

Benutzer benötigen möglicherweise einige Berechtigungen, damit die Anwendung Positionsdienste für die Beacon-Erkennung nutzen kann. Verwenden Sie das folgende Beispiel, um diese Berechtigung manuell anzufordern:

// 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

Für die iOS-Plattform im alternativen Modus müssen die Positionsdienste nicht aktiviert werden. Im Standardmodus (iBeacons) muss die Anforderung der Positionsaktivierung beim ersten Aufruf der App akzeptiert werden.

Für iOS 8.0 im Standardmodus sind bestimmte Schlüssel erforderlich, damit die Anwendung für die Verwendung der für die Beacon-Ermittlung benötigten Positionsdienste aktiviert wird. Die IDE bezieht bereits NSLocationAlwaysUsageDescription und NSLocationWhenInUseUsageDescription ein.

Der folgende Schlüssel muss manuell hinzugefügt werden:

  • NSLocationUsageDescription

Für die Werte ist eine Textmeldung wie z. B. "Diese App muss auf Positionsdienste zugreifen, um Beacons zu überwachen" erforderlich. Das System zeigt die Textmeldung beim Zugriff auf die App-Konfiguration an.

Der Schlüssel kann in der IDE hinzugefügt werden: Wählen Sie Projekt > Optionen > Versionsinformationen, klicken Sie dann mit der rechten Maustaste auf die Tabelle, und wählen Sie Schlüssel hinzufügen.

BeaconKeysFig1.png

Einschränkungen in Räumen

Das Funksignal, das Beacons senden, ist hochempfindlich gegenüber Rauscheffekten, wie Diffraktion, Absorption, Mehrwegreflexionen oder Störungen, die von anderen Geräten herrühren, die in demselben Funkfrequenzband senden. Insbesondere wirken sich diese schädlichen Einflüsse negativ auf das Signal des Beacon in Innenräumen aus. Als Ergebnis sind die aus Leistungsmessungen extrahierten Schätzwerte, wie Rssi (Stärke des empfangenen Signals), Distance (Entfernung) oder Proximity (Näherungsstufe), erheblich instabil und unterliegen starken Schwankungen. Demgemäß nimmt die Genauigkeit dieser Schätzwerte ab.

Signalverarbeitung

Die RTL stellt zwei verschiedene Algorithmen bereit, um das Signal eines Beacon und die aus diesem Signal extrahierten Schätzwerte zu stabilisieren:

  • RssiToDistance führt ein Modell ein, mit dem der aus den Rssi-Messungen abgeleitete Entfernungsschätzwert ermittelt werden kann. Die Robustheit dieses Algorithmus wird durch einen kalibrierten Leistungsparameter, ATxPower, erhöht.
  • TBeaconManager implementiert einen optionalen Differentialfilter-Algorithmus. Dieser Algorithmus stabilisiert die Rssi- und Entfernungs-Messungen. Wählen Sie bei der Eigenschaft CalcMode den Berechnungsmodus Stabilized aus, um diesen Algorithmus zu aktivieren. Dieser Modus ist insbesondere für die Näheschätzung und die Bewegungserkennung geeignet.

Integrieren von Algorithmen

Sie können auch weitere Algorithmen für die Signalverarbeitung integrieren, wobei es sich um allgemeine oder von Ihnen selbst entwickelte Algorithmen handeln kann. Die folgende Liste enthält einige Beispielfilter, die Sie zur Reduzierung von Rauscheffekten implementieren können:

  • Bewegungsmittelungsfilter
  • Gewichtete Durchschnittsfilter
  • Kurvenanpassungsfilter

Siehe auch