wake-up-neo.com

Android 4.3 Bluetooth Low Energy instabil

Ich entwickle derzeit eine Anwendung, die Bluetooth Low Energy verwendet (Test auf dem Nexus 4). Nachdem ich mit den offiziellen BLE-APIs in Android 4.3) begonnen habe, habe ich festgestellt, dass ich nach dem erstmaligen Verbinden eines Geräts selten eine Verbindung zu diesem oder einem anderen Gerät herstellen/damit kommunizieren kann Gerät wieder.

Nach der Anleitung hier kann ich erfolgreich eine Verbindung zu einem Gerät herstellen, Dienste und Merkmale scannen und Benachrichtigungen lesen/schreiben/empfangen, ohne Probleme. Nach dem Trennen und erneuten Herstellen der Verbindung kann ich jedoch häufig weder Dienste/Merkmale scannen noch Lese-/Schreibvorgänge ausführen. Ich kann in den Protokollen nichts finden, was darauf hinweist, warum dies geschieht.

In diesem Fall muss ich die Anwendung deinstallieren, Bluetooth deaktivieren und das Telefon neu starten, bevor es wieder funktioniert.

Wenn ein Gerät nicht verbunden ist, muss close () für das BluetoothGatt-Objekt aufgerufen und auf null gesetzt werden. Irgendwelche Einsichten?


BEARBEITEN:
Log-Dumps: Für diese Logs habe ich mein Telefon gerootet und die Trace-Level von verwandten Objekten in /etc/bluetooth/bt_stack.conf erhöht

Erfolgreiche Verbindung - Erster Versuch nach dem Neustart des Telefons und der Installation der App. Ich kann mich verbinden, alle Dienste/Eigenschaften entdecken und lesen/schreiben.

Fehlgeschlagener Versuch 1 - Dies ist der nächste Versuch nach dem Trennen der obigen Verbindung. Es scheint, dass ich Merkmale entdecken konnte, aber der erste Leseversuch ergab einen Nullwert und wurde bald darauf beendet.

Fehlgeschlagener Versuch 2 - Ein Beispiel, bei dem ich nicht einmal Dienste/Merkmale entdecken kann.


EDIT 2:
Das Gerät, zu dem ich eine Verbindung herstellen möchte, basiert auf dem CC2541-Chip von TI. Ich erhielt ein TI SensorTag (ebenfalls basierend auf dem CC2541) zum Herumspielen und entdeckte, dass TI ein Android App für den SensorTag veröffentlichte gestern. Allerdings hat diese App dasselbe Problem. Ich habe dies auf zwei anderen Nexus 4 mit dem gleichen Ergebnis getestet: Die Verbindung zum SensorTag ist beim ersten oder zweiten Mal erfolgreich, aber (gemäß den Protokollen) werden danach keine Dienste mehr erkannt, was zu Abstürzen aller Art führt. Ich frage mich, ob es ein Problem mit diesem speziellen Chip ist.

186
sa.shadow

Wichtige Hinweise zur Implementierung

(Möglicherweise sind einige dieser Hinweise aufgrund von Android OS-Updates) nicht mehr erforderlich.)

  1. Einige Geräte wie Nexus 4 mit Android 4.3 es dauert mehr als 45 Sekunden, um eine Verbindung mit einer vorhandenen Gatt-Instanz herzustellen von gatt auf jedem verbinden.
  2. Vergiss nicht Android.bluetooth.BluetoothGatt#close() aufzurufen
  3. Beginne einen neuen Thread in onLeScan(..) und verbinde dich dann. Grund: BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback) schlägt immer fehl, wenn LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) im selben Thread auf dem Samsung Galaxy S3 mit Android 4.3) aufgerufen wird (zumindest für Build JSS15J.I9300XXUGMK6 )
  4. Die meisten Geräte filtern Werbung
  5. Verwenden Sie besser nicht Android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback) mit dem Parameter, um nach bestimmten Dienst-UUIDs zu filtern weil dies in Samsung Galaxy S3 mit Android 4.3 und funktioniert nicht für 128-Bit-UUIDs im Allgemeinen völlig kaputt ist.
  6. Gatt kann immer einen Befehl gleichzeitig verarbeiten . Wenn mehrere Befehle kurz hintereinander aufgerufen werden, wird der erste abgebrochen aufgrund der Synchronität der gatt-Implementierung.
  7. Ich sehe oft sogar auf modernen Geräten mit Android 5), dass Wifi Bluetooth stört und umgekehrt. Schalten Sie als letzte Möglichkeit Wifi aus, um Bluetooth zu stabilisieren.

Tutorial für Anfänger

Ein ziemlich guter Einstiegspunkt für Neulinge könnte dieses Video-Tutorial sein: Entwickeln von Bluetooth-Smart-Anwendungen für Android http://youtu.be/x1y4tEHDwk

Das unten beschriebene Problem und die Problemumgehung werden jetzt wahrscheinlich durch Betriebssystemupdates behoben

Problemumgehung: Ich könnte meine App dadurch "stabilisieren" ...

  1. Ich stelle dem Benutzer die Einstellung "Bluetooth neu starten" zur Verfügung. Wenn diese Einstellung aktiviert ist, starte ich Bluetooth an einigen Punkten neu, die darauf hinweisen, dass der Beginn des BLE-Stapels instabil wird. Z.B. wenn startScan false zurückgibt. Ein guter Punkt kann auch sein, wenn serviceDiscovery fehlschlägt. Ich schalte einfach Bluetooth aus und ein.
  2. Ich biete eine andere Einstellung "WLAN ausschalten". Wenn diese Einstellung aktiviert ist, schaltet meine App Wifi aus, wenn die App ausgeführt wird (und schaltet sie danach wieder ein)

Diese Arbeit basiert auf folgenden Erfahrungen ...

  • Ein Neustart von Bluetooth hilft in den meisten Fällen, Probleme mit BLE zu beheben
  • Wenn Sie Wifi ausschalten, wird der BLE-Stapel viel stabiler. Es funktioniert jedoch auch auf den meisten Geräten mit aktiviertem WLAN.
  • Wenn Sie Wifi ausschalten und Bluetooth neu starten, wird der BLE-Stack in den meisten Fällen vollständig wiederhergestellt, ohne dass das Gerät neu gestartet werden muss.
176
OneWorld

WIFI AUSSCHALTEN:

Ich kann auch bestätigen, dass das Ausschalten von WIFI Bluetooth 4.0 stabiler macht, insbesondere bei Google Nexus (ich habe ein Nexus 7).

Das Problem

ist, dass die Anwendung, die ich entwickle benötigt sowohl WIFI als auch kontinuierlich Bluetooth LE Scannen. Daher war es für mich keine Option, WIFI auszuschalten.

Darüber hinaus habe ich festgestellt, dass kontinuierliches Scannen von Bluetooth LE tatsächlich Beenden der WIFI-Verbindung und WIFI-Adapter kann keine Verbindung mehr herstellen zu jedem WIFI-Netzwerk herstellen kann bis der BLE-Scan eingeschaltet ist. (Ich bin mir nicht sicher über Mobilfunknetze und mobiles Internet).
Dies ist definitiv auf folgenden Geräten passiert:

  • Nexus 7
  • Motorola Moto G

BLE-Scannen mit WIFI schien jedoch ziemlich stabil auf:

  • Samsung S4
  • HTC One

Mein Workaround

I BLE scannen nach eine kurze Zeitspanne -4 Sekunden dann I Scan für 3-4 Sekunden ausschalten. Dann wieder EIN.

  • Natürlich schalte ich den BLE-Scan immer aus, wenn ich mich mit einem BLE-Gerät verbinde.
  • Wenn ich die Verbindung zu einem Gerät trenne, starte ich BLE neu (schalte den Adapter aus und wieder ein), um den Stapel zurückzusetzen, bevor ich den Scan erneut beginne.
  • Ich habe auch BLE zurückgesetzt, wenn die Erkennung von services oder characteristics fehlschlägt.
  • Wenn ich Werbedaten von einem Gerät erhalte, mit dem die App eine Verbindung herstellen soll (sagen wir 500 Mal, ohne dass eine Verbindung hergestellt werden kann - das sind ungefähr 5-10 Sekunden für Werbung), setze ich BLE erneut zurück.
15
benka

Stellen Sie sicher, dass Ihr Nexus mit dem Gerät gekoppelt ist. Ich kann nicht überprüfen, ob die Kommunikation ordnungsgemäß funktioniert, aber Sie können mehrmals eine Verbindung herstellen, ohne einen Neustart durchzuführen. Es scheint, dass die erste Verbindung kein Pairing erfordert, aber alle nachfolgenden Versuche tun dies.

Ich werde diese Antwort in ein paar Tagen aktualisieren, wenn ich die Serviceerkennung teste und Lese- und Schreibanforderungen ohne Neustart erhalte.

BEARBEITEN: Es stellte sich heraus, dass ich eine Entwicklungsfirmwareversion (unseren Sensor) getestet habe, die Probleme verursachte, wenn sie nicht gepaart wurden. Unsere neueste Firmware-Version für die Produktion funktioniert einwandfrei für die 2540er und 2541er.

EDIT: Ich habe bemerkt, dass auf dem Nexus 7 2013 die Verbindungen stabiler sind, wenn WiFi ausgeschaltet ist. Ich würde gerne wissen, ob dies jemand anderem hilft.

EDIT: Ich scheine es mit Pairing rückwärts gehabt zu haben. Alles funktioniert gut, wenn nicht gepaart. Nach dem Pairing treten genau die gleichen Symptome auf wie beim OP. Es ist nur noch nicht bekannt, ob dies mit unserer Firmware oder der Android BLE API zusammenhängt. Seien Sie vorsichtig, wenn Sie dies testen, da Sie nach dem Pairing aufgrund eines in 3b erklärten Fehlers möglicherweise nicht in der Lage sind, die Paarung aufzuheben davon post .

6
Mikt25

Bei einigen Modellen liegt ein Defekt vor: https://code.google.com/p/Android/issues/detail?id=18044

Andererseits bestand in meinem Fall das Problem, dass meine Verbindung in der onDestroy-Methode nicht richtig geschlossen wurde. Nach dem korrekten Schließen besteht für mich kein Problem, egal ob WLAN ein- oder ausgeschaltet ist.

btGatt.disconnect();
btGatt.close();
4
Krystian

Ich hatte ein ähnliches Problem. Mein Fix war

if (Build.VERSION.SDK_INT >= 23) {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
} else {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
}

& Nach Verbindungsabbruch schließen.

1
Sam Reyes