Bluetooth Low Energy in Xamarin App – Ein Projektbericht
In diesem Jahr konnten wir die Firma KELLER AG für Druckmesstechnik bei ihrem Projekt beraten und unterstützen. Die Firma entwickelt Drucksensoren für verschiedenste Anwendungsbereiche. Die über die Sensoren gemessenen Daten werden entweder aufgezeichnet und später abgerufen oder sollen direkt versendet werden.
Die Daten sollen an eine Mobile App, entweder für Android oder iOS, gesendet werden. Um beide Plattformen gleichzeitig und mit minimalem Aufwand abzudecken, wurde Xamarin als Cross Plattform Technologie gewählt. Das UI wurde mit Xamarin Forms umgesetzt.
In einigen Anwendungsfällen ist keine kontinuierliche Stromversorgung für die Sensoren möglich, weshalb die Sensoren über Batterie betrieben werden. Für eine möglichst lange Laufzeit wird in einem solchen Fall auf Bluetooth Low Energy (BLE) gesetzt.
Bluetooth Low Energy (BLE)
BLE darf nicht mit dem klassischen Bluetooth verwechselt werden. So wird das klassische Bluetooth verwendet, um z.B. Audio oder Video zu streamen oder Dokumente an einen Drucker zu senden. Beim klassischen Bluetooth wird immer ein Device-Pairing benötigt.
Bei BLE werden jeweils nur sehr kleine Daten-Pakete verschickt. Dies benötigt viel weniger Energie. So können zum Beispiel bei einem Bild in einem Museum über BLE eine URL zu weiteren Informationen des Kunstwerks hinterlegt sein. Das Mobiltelefon kann die Daten empfangen, ohne sich vorgängig mit dem anderen Gerät zu pairen (Broadcast).
Das Contact Tracing in der SwissCovid-App nutzt ebenfalls BLE. Dabei werden zufällige Codes zwischen den App-Nutzern, die sich in der Nähe befinden, via BLE ausgetauscht. Bei einer Infizierung eines Nutzers werden die zufälligen Codes markiert. So können alle Teilnehmer, welche einen dieser Codes empfangen haben, informiert werden. Dies ermöglicht ein anonymisiertes Contact Tracing.
Peripheral, Services und Characteristic
Für eine standardisierte Kommunikation wurde von der Bluetooth Special Interest Group die GATT-Spezifikation entwickelt. Gemäss dieser Spezifikation wird das Gerät, welches über BLE Daten versendet als Peripheral bezeichnet. Dieses Peripheral bietet einen oder mehrere Services an, z.B. einen Dienst mit Device-Informationen. Innerhalb eines Services gibt es wiederum eine oder mehrere Characteristics. Eine Characteristic ist, wie der Name bereits sagt, ein Ausprägungsmerkmal.
Auf der Characteristic wiederum ist definiert, welche Operationen verfügbar sind:
- Read
- Write
- Write Without Response
- Notify
- Indicate
- und weitere
Diese Operationen sind jeweils aus Sicht des Peripherals zu sehen. So bedeutet Read etwa, dass jemand den Wert lesen kann. Einige der Operationen werden dabei vom Gegenüber bestätigt (Acknowledge). Notify und Indicate werden genutzt, um immer wieder Datenpakete zu schicken, z.B. eine Veränderung des aktuellen Druckmesswertes. Indicate muss dabei vom Gegenüber bestätigt werden. Wenn auf eine Charakteristik hingegen die Operation “Notify” angewendet wird, gibt es keine Prüfung, ob alle Daten korrekt übermittelt wurden.
Es gibt eine Sammlung von vordefinierten GATT-Services. Diese kann man aber auch selbst definieren.
Xamarin und Bluetooth Low Energy
Es gibt mehrere Software-Bibliotheken, welche benutzt werden können, um aus einer Xamarin App BLE zu nutzen. Während des Projekts mussten wir uns für eine der Bibliothek entscheiden. Wir favorisierten eine, welche Reactive Extensions nutzt. So können sich Observer einfach auf neue Messwerte der Drucksensoren subscriben, anstatt dass ein fehleranfälliges Event-Handling implementiert werden musste. Schlussendlich haben wir uns für die Shiny Lib von Allan Ritchie entschieden. Die Bluetooth Komponente der Shiny Lib ist aktuell erst als Beta-Version verfügbar. Nach einigen Tests haben wir uns trotzdem dafür entschieden, diese zu verwenden. Die Bibliothek ist eine Neuentwicklung einer älteren desselben Entwicklers, weshalb wir davon ausgegangen sind, dass bereits viele Kinderkrankheiten ausgemerzt sein dürften. Die Open Source Lizenz MIT erlaubt es uns zudem, allfällige Fehler auch selbst zu korrigieren.