Verwenden von Bluetooth Low Energy

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Verwenden von Bluetooth


Weil die Bluetooth Core Specification seit der Version 4.0 unterschiedliche Typen von "Bluetooth"-Protokollen, wie Bluetooth Low Energy, definiert, wird das ursprüngliche Bluetooth-Protokoll "Classic Bluetooth" genannt.

Bluetooth Low Energy oder Smart Bluetooth stellt eine neue Umgebung für Geräte mit einer geringen Datenübertragungsmenge und niedrigerem Energieverbrauch bereit.

So implementieren Sie die BluetoothLE-Unterstützung für Standarddienste in Ihren Anwendungen:

Plattformunterstützung

Plattform Bluetooth Low Energy
Client Server

Windows(*)

10+

10+ (**)

macOS

10.7+

10,9+

iOS

5+

6+

Android

4.3+

5+

Hinweis: Windows Server unterstützt Bluetooth nicht, siehe General Bluetooth Support in Windows (EN).
Hinweis: Die WinRT Bluetooth-API unterstützt die BLE-Bekanntgabedaten durch das Feld herstellerspezifische Daten, aber sie implementiert die GATT-Server-Funktionalitäten nicht vollständig.
Achtung: Anwendungen, die auf einer niedrigeren Windows-Plattform als Windows 10 ausgeführt werden, unterstützen Bluetooth LE nicht.

GATT-Profile (GENERIC ATTRIBUTE)

Profile sind allgemeine Definitionen, die festlegen, wie die Standarddienste in Ihren Anwendungen verwendet werden. Beispielsweise gibt es ein Herzfrequenzprofil, das in Fitness- oder Gesundheitsanwendungen eingesetzt wird. Das Servergerät mit einem Herzfrequenzsensor stellt den Standard-Herzfrequenzdienst bereit, sodass der BluetoothLE-Client den Dienst findet und mit dem Sammeln von Daten, z. B. Schläge pro Minute, beginnt.

Das GATT-Profil ist die Kombination von Dienst und Merkmalen.

Die offizielle Seite mit den GATT-Profilen ist GATT Specifications for Standard Profiles (EN).

Einfügen einer TBluetoothLE-Komponente

Implementieren Sie mit der neuen TBluetoothLE-Komponente das RTL-BluetoothLE-Feature für Server- und Clientanwendungen.

TBluetoothLE fügt die Unit System.Bluetooth in Ihre Anwendung ein und ruft intern TBluetoothLEManager.Current auf, um eine Instanz von TBluetoothLEManager abzurufen. TBluetoothLEManager ist die Hauptklasse für die Bluetooth Low Energy-Kommunikation.

Hinweis: TBluetoothLEManager.Current gibt immer dieselbe Instanz von TBluetoothLEManager zurück. Sie benötigen nur eine Instanz von TBluetoothLEManager.

Ermitteln von Geräten

BluetoothLE arbeitet nicht wie Classic Bluetooth, Sie müssen die Geräte nicht koppeln. BluetoothLE-Clients müssen BluetoothLE-Server ermitteln.

Hinweis:
  • Bei Anwendungen, die auf Windows-Plattformen unter Windows 10 ausgeführt werden, müssen die Geräte vor der Ermittlung der BluetoothLE-Server zuerst gekoppelt werden. Weitere Informationen finden Sie unter Windows Bluetooth FAQ (EN).
  • Auf WinRT API für Windows 10+-Plattformen können Geräte ohne Koppelung ermittelt werden.

Mit der Methode DiscoverDevices ermitteln Sie BluetoothLE-Server.

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;

Nach dieser Zeitspanne wird das Ereignis OnEndDiscoverDevices ausgelöst. Wenn das Gerät ermittelt wurde, können Sie mit dem Abrufen der Dienste und Merkmale aus dem Standardprofil, wie im Folgenden beschrieben, beginnen.

Verwenden von Suchfiltern

Die RTL stellt eine BLE-Suchfilterimplementierung bereit, die die neuen BLE-Chips mit geringem Energieverbrauch nutzt.

Sie können mit angepassten, unabhängigen Suchfiltern nach bestimmten BLE-Geräten suchen:

  • Fügen Sie dann der Filterliste den Filter hinzu, und beginnen Sie die Ermittlung von Geräten mit der neuen Implementierung von StartDiscovery.
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;

Dienste und Merkmale

Ermitteln und Abrufen von Diensten

Dienste sind Sammlungen von Merkmalen und Beziehungen zu anderen Diensten, die das Verhalten eines Geräteteils kapseln.

Ein GATT-Profil enthält einen oder mehrere Standarddienste, die über eine Zahl bezeichnet werden. Beispielsweise ist dem Herzfrequenzdienst offiziell die Zahl "0x180D" zugeordnet.

Die offizielle Seite mit den Standarddienstinformationen ist Standard BluetoothLE Services (EN).

Um einen Dienst abzurufen, müssen Sie die vollständige UUID verwenden. Die UUID setzt sich aus der dem Standarddienst zugeordneten Zahl und dem Basis-Bluetooth-Code zusammen. Der vollständige Code für den Herzfrequenzdienst lautet beispielsweise 0000180D-0000-1000-8000-00805F9B34FB.

Mit der Methode DiscoverServices ermitteln Sie Dienste für ein bestimmtes Gerät. Nach der Ermittlung der Dienste wird das Ereignis OnServicesDiscovered ausgelöst.

Sie müssen ermittelte Dienste abrufen. Mit der Methode GetServices können Sie eine Liste mit Diensten und mit der Methode GetService einen bestimmten Dienst von einem Gerät abrufen.

Ermitteln und Abrufen von Merkmalen

Ein Dienst kann mehrere Merkmale enthalten, die Informationen für diesen Dienst bereitstellen. Jedes Merkmal ist mit einer offiziellen Nummer gekennzeichnet. Der Herzfrequenzdienst hat beispielsweise ein Merkmal zum Messen des Herzschlags, die Herzschlagmessung (Heart Rate Measurement) mit der UUID 00002A37-0000-1000-8000-00805F9B34FB, und ein weiteres Merkmal zum Messen der Position des Sensors, Position des Körpersensors (Body Sensor Location) mit der UUID 00002A38-0000-1000-8000-00805F9B34FB.

Mit der Methode GetCharacteristics rufen Sie eine Liste der Merkmale für einen bestimmten Dienst ab, mit der Methode GetCharacteristic ermitteln Sie Informationen über ein bestimmtes Merkmal.

Lesen, Schreiben oder Abonnieren eines Merkmals

Wenn Sie das Merkmal mit GetCharacteristic abgerufen haben, können Sie die enthaltenen Informationen lesen oder schreiben (sofern verfügbar). Die Ereignisbehandlungsroutine OnCharacteristicRead wird nach dem Lesen des Merkmals ausgelöst.

Mit der Methode ReadCharacteristic können Sie den aktuellen Wert eines Merkmals abrufen. Verwenden Sie WriteCharacteristic zum Schreiben, sofern diese Option auf dem Server verfügbar ist.

Sie können ein Merkmal auch abonnieren, um die Informationen bei jeder Änderung abzurufen. Um beispielsweise die Überwachung des Herzfrequenzsensors zu beginnen, können Sie den aktuellen Wert mit der Methode GetCharacteristic lesen und dann mit der Methode SubscribeToCharacteristic die Informationen abrufen, sobald sie sich ändern. Verwenden Sie die Methode UnSubscribeToCharacteristic, um die Überwachung zu beenden.

Verarbeiten der empfangenen Daten

Das Clientgerät empfängt ein Array mit Daten vom Server. Befolgen Sie die Spezifikationen im GATT-Profil, um die Daten in lesbare Informationen umzuwandeln. Die Datenpaketdetails für das Merkmal Herzschlagmessung (Heart Rate Measurement) finden Sie beispielsweise auf der offiziellen Seite: Heart Rate Measurement Data Package Structure (EN).

Bei dem Merkmal Herzschlagmessung (Heart Rate Measurement) enthält das erste Byte z. B. Flags mit Informationen über die im Bluetooth LE-Paket übertragenen Daten. Das Bit 0 im Feld "Flags" legt das Format des Herzschlagwertes fest: UINT8 oder UINT16. Je nach Format müssen Sie das zweite Byte des Datenpakets oder das zweite und das dritte Byte extrahieren, um die Schläge pro Minute zu erhalten.

BluetoothLE-Server

So erstellen Sie einen Server, der Standarddienste bereitstellt oder veröffentlicht:

  1. Fügen Sie die Komponente TBluetoothLE in Ihr Projekt ein.
  2. Veröffentlichen Sie mit der Methode GetGattServer die Bluetooth Low Energy-Dienste.
  3. Erstellen Sie mit der Methode CreateService aus der Klasse TBluetoothGattServer den Dienst mit der Standard-UUID.
  4. Erstellen Sie mit der Methode CreateCharacteristic aus der Klasse TBluetoothGattServer das Merkmal für den Dienst mit der Standard-UUID.
  5. Fügen Sie mit der Methode AddService dem GATT-Server den Dienst hinzu.
  6. Die Ereignisbehandlungsroutine OnCharacteristicReadRequest wird ausgelöst, wenn der Server eine Leseanforderung vom Clientgerät erhält.
  7. Die Ereignisbehandlungsroutine OnCharacteristicWriteRequest wird ausgelöst, wenn der Server eine Schreibanforderung vom Clientgerät erhält.

Nicht-Standardprofile

Sie können Server- und Clientanwendungen mit der BluetoothLE-Technologie ohne GATT-Profile erstellen, das heißt, dass Sie eigene Dienste und Merkmale für die private Kommunikation zwischen Server und Clientgeräten erstellen können.

Für Nicht-Standardprofile muss eine 128-Bit-UUID verwendet werden, die zufällig generiert werden muss.

Jedes Bluetooth LE-Gerät, das als GATT-Server fungiert, muss den offiziellen Dienst für den allgemeinen Zugriff (Generic Access) mit den Merkmalen Gerätename und -darstellung (Device Name and Appearance) implementieren. Weitere Informationen finden Sie auf der offiziellen Website: Generic Access service (EN).

Hinzufügen von Unterstützung für die Hintergrundausführung unter iOS

Wenn für Ihre iOS-Anwendung die weitere Ausführung bestimmter Dienste im Hintergrund erforderlich ist, sollten Sie die Werte des Schlüssels UIBackgroundModesProject auf der Seite Versionsinformationen angeben, bevor Sie Ihre fertige Anwendung weitergeben.

Hinweis: Wenn Sie Ihre Anwendung beim Auftreten eines Bluetooth-Ereignisses "aufwecken" müssen, fügen Sie dem Schlüssel UIBackgroundModesProject die folgenden Stringwerte hinzu:
  • bluetooth-central: Wenn Ihre Anwendung die zentrale Rolle übernimmt.
  • bluetooth-peripherical: Wenn Ihre Anwendung eine periphere Rolle übernimmt.

Weitere Informationen finden Sie unter Core Bluetooth Background Processing for iOS Apps (EN).

Siehe auch