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 ersten Anschließen eines Geräts selten wieder erfolgreich eine Verbindung zu diesem Gerät oder einem anderen Gerät herstellen / mit ihm kommunizieren kann.
Wenn ich der Anleitung hier folge , kann ich ohne Probleme erfolgreich eine Verbindung zu einem Gerät herstellen, Dienste und Eigenschaften scannen und Benachrichtigungen lesen / schreiben / empfangen. Nach dem Trennen und erneuten Verbinden 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.
Immer wenn ein Gerät getrennt wird, rufe ich close () für das BluetoothGatt-Objekt auf und setze es auf null. Irgendwelche Einsichten?
BEARBEITEN:
Protokollspeicherauszüge: Für diese Protokolle habe ich mein Telefon gerootet und die Ablaufverfolgungsstufen verwandter Elemente in /etc/bluetooth/bt_stack.conf erhöht
Erfolgreiche Verbindung - Erster Versuch nach dem Neustart des Telefons und der Installation der App. Ich kann eine Verbindung herstellen, alle Dienste / Merkmale entdecken und lesen / schreiben.
Fehlgeschlagener Versuch 1 - Dies ist der nächste Versuch nach dem Trennen von der oben genannten erfolgreichen Verbindung. Es scheint, dass ich Merkmale entdecken konnte, aber der erste Leseversuch ergab einen Nullwert und wurde bald darauf getrennt.
Fehlgeschlagener Versuch 2 - Ein Beispiel, bei dem ich nicht einmal Dienste / Merkmale erkennen kann.
EDIT 2:
Das Gerät, mit dem ich eine Verbindung herstellen möchte, basiert auf dem CC2541-Chip von TI. Ich habe einen TI SensorTag (ebenfalls basierend auf dem CC2541) zum Herumspielen erhalten und festgestellt, dass TI gestern eine Android-App für den SensorTag veröffentlicht hat. Diese App hat jedoch das gleiche 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 (laut Protokoll) kann ich danach keine Dienste mehr erkennen, was zu allen möglichen Abstürzen führt. Ich frage mich, ob es ein Problem mit diesem speziellen Chip ist.
Antworten:
Wichtige Implementierungshinweise
(Möglicherweise sind einige dieser Hinweise aufgrund von Android-Betriebssystem-Updates nicht mehr erforderlich.)
android.bluetooth.BluetoothGatt#close()
onLeScan(..)
und verbinden Sie sich dann. Grund:BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)
schlägt immer fehl, wennLeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
im selben Thread auf Samsung Galaxy S3 mit Android 4.3 (zumindest für Build JSS15J.I9300XXUGMK6) aufgerufen wird.android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback)
den Parameter besser nicht , um nach bestimmten Dienst-UUIDs zu filtern, da dies in Samsung Galaxy S3 mit Android 4.3 vollständig fehlerhaft ist und für 128-Bit-UUIDs im Allgemeinen nicht funktioniert .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/x1y4tEHDwk0
Das unten beschriebene Problem und die Problemumgehung werden jetzt wahrscheinlich durch Betriebssystemupdates behoben
Umgehen: Ich könnte meine App damit "stabilisieren" ...
Diese Problemumgehung basiert auf folgenden Erfahrungen ...
quelle
WIFI ausschalten:
Ich kann auch bestätigen, dass durch das Ausschalten von WIFI Bluetooth 4.0 insbesondere unter Google Nexus (ich habe ein Nexus 7) stabiler wird.
Das Problem
ist , dass die Anwendung , die ich entwickeln werde muss sowohl WIFI und kontinuierliche Bluetooth LE - Scanning . Das Ausschalten von WIFI war für mich also keine Option.
Außerdem habe ich festgestellt, dass ein kontinuierliches Bluetooth LE-Scannen die WIFI-Verbindung tatsächlich beenden und den WIFI-Adapter dazu bringen kann, keine Verbindung zu einem WIFI-Netzwerk herzustellen, bis der BLE-Scan eingeschaltet ist. (Ich bin mir nicht sicher über Mobilfunknetze und mobiles Internet).
Dies geschah definitiv auf folgenden Geräten:
Das BLE-Scannen mit aktiviertem WIFI schien jedoch ziemlich stabil zu sein:
Meine Problemumgehung
Ich scanne BLE für einen kurzen Zeitraum von 3-4 Sekunden und schalte dann den Scan für 3-4 Sekunden aus . Dann wieder EIN.
services
odercharacteristics
fehlschlage.quelle
Stellen Sie sicher, dass Ihr Nexus mit dem Gerät gekoppelt ist. Ich kann nicht überprüfen, ob die Kommunikation ordnungsgemäß funktioniert oder nicht, aber Sie können ohne Neustart mehrmals eine Verbindung herstellen. 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 Entwicklungs-Firmware-Version (unseren Sensor) getestet habe, die Probleme verursachte, wenn sie nicht gekoppelt wurde. Unser neuester Firmware-Build für die Produktion funktioniert einwandfrei für die 2540er und 2541er.
BEARBEITEN: Ich habe festgestellt, dass auf dem Nexus 7 2013 die Verbindungen stabiler sind, wenn WLAN ausgeschaltet ist. Ich würde gerne wissen, ob dies jemand anderem hilft.
EDIT: Ich habe es anscheinend mit Pairing rückwärts gehabt. Alles funktioniert gut, wenn nicht gepaart. Nach dem Pairing treten genau die gleichen Symptome wie beim OP auf. 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 dieses Beitrags erläuterten Fehlers möglicherweise nicht mehr das Pairing durchführen können .
quelle
Bei einigen Modellen liegt ein Defekt vor: https://code.google.com/p/android/issues/detail?id=180440
Andererseits bestand in meinem Fall das Problem darin, dass meine Verbindung in der onDestroy-Methode nicht ordnungsgemäß geschlossen wurde. Nach dem korrekten Schließen besteht für mich kein Problem, unabhängig davon, ob das WLAN ein- oder ausgeschaltet ist.
quelle
close
notwendig?Ich hatte ein ähnliches Problem. Mein Fix war
& Anruf nach dem Trennen schließen.
quelle