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