2017-04-18 5 views
0

Ich entwickle eine Android-BLE-App, in der ich versuche, eine stabile Verbindung zwischen der App und einem BLE-Gerät herzustellen.Android BLE-Gerät zum erneuten Verbinden nach dem Schließen der App speichern

Um dies zu erreichen, möchte ich, dass meine App die BLE-Gerätedaten in freigegebenen Einstellungen oder irgendwo speichert.

Nach dem Schließen der App möchte ich, dass meine App diese Daten abruft und versucht, eine Verbindung herzustellen, ohne nach Geräten zu suchen.

Ich bevorzuge es zu vermeiden, jedes Mal zu scannen, weil Scan mir viele Probleme gibt und es Zeit braucht.

Wie geht das? Gibt es eine Möglichkeit, BLE-Daten zu speichern?

Antwort

2

Sie müssen die Bluetooth-Geräteadresse (AB: CD: EF: 01: 02: 03) des Geräts z. B. in freigegebenen Einstellungen oder in einer SQLite-Datenbank speichern. Verwenden Sie dann https://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#getRemoteDevice(java.lang.String), wenn Sie die App später neu starten, um ein BluetoothDevice-Objekt abzurufen. Sobald Sie das BluetoothDevice-Objekt haben, können Sie wie gewohnt die connectGatt-Methode verwenden.

Es gibt einige undokumentierte Dinge, die Sie jedoch beachten sollten. Aufgrund einiger schrecklicher Designfehler in Androids BLE-API gibt es keine Möglichkeit zu sagen, ob die angegebene Adresse eine öffentliche Adresse oder eine zufällige Adresse ist. (Sie können mehr über verschiedene Adresstypen bei https://devzone.nordicsemi.com/question/43670/how-to-distinguish-between-random-and-public-gap-addresses/ lesen). Die getRemoteDevice-Methode sollte einen zusätzlichen Parameter "zufällige Adresse/öffentliche Adresse" verwenden, tut dies aber nicht. Ohne den richtigen Adresstyp kann der Bluetooth-Controller keine Verbindung zum Gerät herstellen.

Android BLE Stapel hat einige interne Heuristiken zu "raten", wenn die Adresse öffentlich oder zufällig ist, aber das unterscheidet sich leider zwischen Android-Versionen und auch wenn Sie AutoConnect = True oder False verwenden. Wenn Sie jedoch das Gerät verbunden haben (https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createBond()), speichert es in seiner internen DB, ob die angegebene Adresse öffentlich oder zufällig ist. Wenn das Peripheriegerät, mit dem Sie eine Verbindung herstellen möchten, eine zufällige auflösbare Adresse verwendet, kann es das auch handhaben, wenn Sie eine Verbindung verwenden. Daher rate ich dringend zur Bindung.

Wenn Sie kein Bonding verwenden, müssen Sie zuerst scannen, bevor Sie eine Verbindung zum Gerät herstellen. Wenn Sie einen Scan starten und ein Gerät erkannt wird, speichert der BLE-Stack von Android vorübergehend (bis zum nächsten Neustart von Bluetooth) die Adresse Geben Sie eine Adresse ein.

+0

Sie haben mich erleuchtet, danke, BLE ist wirklich schwer zu verstehen. –

Verwandte Themen