Erstellen von Hintergrunddiensten für Bluetooth Low Energy auf Android

Lesezeit: 4 Minuten

Benutzer-Avatar
Vegar Westerland

Hintergrund:

Idealerweise möchte ich, dass mein Android-Gerät ständig nach Bluetooth Low Energy-Geräten sucht und eine Anwendung starten kann, wenn ein neues Gerät mit bestimmten Eigenschaften auftaucht.

So listet das Broadcast-Paket in BLE beispielsweise eine Reihe von Diensten auf, die von der Broadcasting-Vorrichtung bereitgestellt werden. Eine App könnte dann Interesse an bestimmten Diensten anmelden und automatisch gestartet werden, wenn ein Gerät mit diesen Diensten in Reichweite kommt.

Soweit ich weiß, funktioniert die Android BLE-API so nicht? Wie kann ich also etwas Ähnliches bekommen?

Möglichst einfaches Beispiel:

Ich habe einen BLE-Sensor, der die Umgebungstemperatur im Laufe der Zeit protokolliert. Immer wenn mein Android-Telefon nah genug ist, möchte ich eine Verbindung herstellen und alle Daten herunterladen und an eine Cloud-Speicherlösung senden. Diese App würde keine GUI benötigen (zumindest nicht nach Abschluss der Konfiguration). Aber wie soll es im Hintergrund laufen, ohne den Akku zu entleeren, mir aber trotzdem eine ziemlich gute Chance geben, das Gerät schnell anzuschließen, sobald es in Reichweite ist?

Frage:

Muss ich einen Timer einstellen und die App hin und wieder aufwecken und dann manuell mit dem Scannen beginnen? Welche Art von Intervallen sollte ich dann wählen. Wie lange kann ich den Scanner laufen lassen, ohne den Akku zu beeinträchtigen?

Mögliche Lösung:

Das ist mir bisher eingefallen.

  • Eine Konfigurationsaktivität zum Festlegen der Intervalle und Geräte, nach denen gesucht werden soll
  • Die Konfigurationsaktivität richtet einen WakefulBroadcastReceiver ähnlich dem ein Planer Beispiel
  • Wenn der Empfänger das onReceive-Ereignis erhält, starte ich einen BLE-Scan-Dienst (den ich geschrieben habe) als Wakeful-Dienst.
  • Der Scan-Dienst beginnt mit dem Scannen (mit einem registrierten Rückruf).
  • Der Dienst erhält möglicherweise adv-Berichte, auf die er reagieren kann
  • Nach einer Zeitüberschreitung stoppt der Dienst den Scanner und beendet den Weckdienst.

Das funktioniert, aber ich bin mir nicht sicher, ob es der beste Weg ist. Ich weiß auch nicht, wie kleine Intervalle ich haben kann und trotzdem vermeiden kann, die Batterielebensdauer zu zerstören. Was ich möchte, ist, alle zwei Minuten mit dem Scannen zu beginnen und 10-20 Sekunden lang zu scannen. Aber ich fürchte, das wäre ziemlich häufig, um das Gerät aufzuwecken?

  • Ich habe auch die gleiche Frage. Wenn jemand sie erklären könnte, wäre es großartig.

    – Benutzer2847518

    5. Dezember 2013 um 16:39 Uhr

  • Das Scannen im Hintergrund ist einfach genug. Dies zu tun, ohne die Batterie zu entladen, ist etwas ganz anderes. Wie Sie wahrscheinlich im Bluetooth LE-Beispielcode gesehen haben, ist das Scannen ein aktiver Prozess.

    – David S.

    31. Dezember 2013 um 14:46 Uhr

  • @DShaw: Warum muss es ein aktiver Prozess sein? Ich beginne mit dem Scannen und erhalte die Werbeberichte als Rückrufe. Zwischendurch konnte das Gerät schlafen. Ich weiß nicht, wie das auf Android funktioniert, aber auf einem eingebetteten Gerät mit geringem Stromverbrauch würde die CPU schlafen, während das Radio läuft.

    – Vegar Westerlund

    1. Januar 2014 um 14:13 Uhr

  • Das Ausführen des Funkgeräts zum Scannen nach Geräten ist ein aktiver Vorgang und verbraucht Akku.

    – Nathan Walters

    1. Januar 2014 um 23:32 Uhr

  • @NathanWalters: Das BLE-Radio ist mit ziemlicher Sicherheit ein Konnektivitätsgerät, was bedeutet, dass es den Scanner ausführen kann, während die Haupt-CPU schläft. Es heißt nicht umsonst Niedrigenergie. Das Radio sollte in der Lage sein, einen Scanner im Durchschnitt mit weniger als 200 uA zu betreiben. Das ist im Vergleich zur Haupt-CPU vernachlässigbar. Die Haupt-CPU sollte in weniger als 1 ms (vielleicht ein paar hundert us) aufwachen, den Scanner starten und wieder schlafen gehen und dann schlafen, während das Radio scannt, nur aufwachen, um Werbeberichte zu verarbeiten (was wiederum ein paar dauern sollte Hundert US PR-Event).

    – Vegar Westerlund

    3. Januar 2014 um 8:08 Uhr

Benutzer-Avatar
davidgyoung

Diese Funktionalität wurde vollständig in die Open Source verschoben Android-Beacon-Bibliothek welches wird:

  • wecken/starten Sie Ihre App, wenn iBeacons erkannt werden, die einem gewünschten Muster entsprechen

  • Führen Sie Beacon-Scans im Hintergrund durch, auch wenn der Benutzer Ihre App noch nicht gestartet hat

  • Reduzieren Sie die Scanrate automatisch im Hintergrund auf 30 Sekunden alle fünf Minuten, um den Akku zu schonen. (Zeitablauf konfigurierbar.)

Codebeispiele werden gezeigt hier

Wenn Ihr BLE-Gerät kein Beacon ist, können Sie diese Bibliothek dennoch verwenden, um dies zu erreichen, indem Sie Ihren Sensor auch als Beacon senden lassen und sich nach seiner Erkennung mit dem Hauptdienst verbinden.

  • unterscheidet es sich von dem der integrierten Android BLE API

    – Rahul Matte

    21. Oktober 2015 um 18:55 Uhr

  • Sehr unterschiedlich, ja. Es ist eine viel höhere API, die die Arbeit mit Beacons einfach macht. Wenn Sie die integrierte BLE-API verwenden, müssen Sie das gesamte Parsing und die schwere Arbeit selbst erledigen.

    – davidgyoung

    21. Oktober 2015 um 23:02 Uhr

  • Was haben Sie keinen Zugriff auf die Firmware des Geräts und können es nicht in ein Beacon umwandeln?

    – Mitch Dart

    4. Juli 2016 um 11:44 Uhr

  • Es ist nur für Beacons, nicht für BLE. @RahulMatte

    – asimomez

    13. Oktober 2020 um 21:54 Uhr


1093470cookie-checkErstellen von Hintergrunddiensten für Bluetooth Low Energy auf Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy