Verwenden von Bluetooth Low Energy
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:
- Einfügen einer TBluetoothLE-Komponente in Ihr Projekt
- Ermitteln von Bluetooth LE-Geräten
- Ermitteln und Abrufen von Diensten für das Gerät
- Ermitteln und Abrufen der Merkmale für das Gerät
- Lesen, Schreiben oder Abonnieren eines Merkmals
- Ermitteln der Informationen aus den Rohdaten
Inhaltsverzeichnis
Plattformunterstützung
Plattform | Bluetooth Low Energy | |
---|---|---|
Client | Server | |
Windows(*) |
10+ |
10+ (**) |
macOS |
10.7+ |
10,9+ |
iOS |
5+ |
6+ |
Android |
4.3+ |
5+ |
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.
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.
- 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:
- Erstellen Sie Ihren Filter als TBluetoothLEScanFilter.
- Geben Sie die Felder an, anhand derer Sie die Geräte filtern möchten.
- Optional können Sie für Geräte, die ManufacturerSpecificData verwenden, wie AltBeacons und iBeacons, mit der Hilfsklasse TBeaconManufacturerDataHelper nach diesen Daten filtern. Übergeben Sie dazu den TBeaconManufacturerDataHelper-Inhalt an den Filter.
- 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:
- Fügen Sie die Komponente TBluetoothLE in Ihr Projekt ein.
- Veröffentlichen Sie mit der Methode GetGattServer die Bluetooth Low Energy-Dienste.
- Erstellen Sie mit der Methode CreateService aus der Klasse TBluetoothGattServer den Dienst mit der Standard-UUID.
- Erstellen Sie mit der Methode CreateCharacteristic aus der Klasse TBluetoothGattServer das Merkmal für den Dienst mit der Standard-UUID.
- Fügen Sie mit der Methode AddService dem GATT-Server den Dienst hinzu.
- Die Ereignisbehandlungsroutine OnCharacteristicReadRequest wird ausgelöst, wenn der Server eine Leseanforderung vom Clientgerät erhält.
- 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.
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).