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.
(Möglicherweise sind einige dieser Hinweise aufgrund von Android OS-Updates) nicht mehr erforderlich.)
Android.bluetooth.BluetoothGatt#close()
aufzurufenonLeScan(..)
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 )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.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
Problemumgehung: Ich könnte meine App dadurch "stabilisieren" ...
Diese Arbeit basiert auf folgenden Erfahrungen ...
Ich kann auch bestätigen, dass das Ausschalten von WIFI Bluetooth 4.0 stabiler macht, insbesondere bei Google Nexus (ich habe ein Nexus 7).
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:
BLE-Scannen mit WIFI schien jedoch ziemlich stabil auf:
I BLE scannen nach eine kurze Zeitspanne -4 Sekunden dann I Scan für 3-4 Sekunden ausschalten. Dann wieder EIN.
services
oder characteristics
fehlschlägt.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 .
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();
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.