Bluetooth LE-Werbung schlägt fehl, wenn sie zyklisch gestartet und gestoppt wird
Ich habe Bluetooth LE-Werbung ausprobiert, z. B. mit einem Android-Telefon als BLE-Peripheriegerät. Das Starten und Stoppen einer konstanten Werbung funktioniert einmal, aber wenn ich tatsächlich verschiedene Daten übertragen möchte, müsste ich die Werbung in einem Zyklus starten, stoppen und neu starten und immer das Werbepaket ändern.
Ich benutze diese Methoden natürlich:
BluetoothLeAdvertiser.startAdvertising ()
BluetoothLeAdvertiser.stopAdvertising ()
Zumindest auf einem Motorola Moto G 4G 2. Generation. (XT1072) mit Android 5.0.2 läuft der Zyklus nur eine Weile und dann läuft im Bluetooth-Stack etwas schief und eine neue Werbung kann nicht mehr gestartet werden. Wenn der Zyklus schnell ausgeführt wird, geschieht dies schnell, und wenn er langsam ausgeführt wird, dauert es länger, so dass ein gewisser Zusammenhang mit dem Auffüllen des Puffers besteht.
Meine Frage ist Passiert das auch auf anderen Geräten als Motorola?
(Und alle anderen Kommentare dazu sind natürlich willkommen.)
Theoretisch könnte es von einer herstellerspezifischen HAL-Implementierung usw. abhängen. Ich würde gerne wissen, ob ich nur ein anderes Gerät anschaffen sollte, um daran arbeiten zu können, da ein Fix von Google / Motorola natürlich einige Zeit in Anspruch nehmen würde.
Diese Test App. kann verwendet werden, um dies auszuprobieren:
https: //bitbucket.org/MarkusKauppinen/bleadvertisertes
Wenn alles in Ordnung ist, bleibt die Werbung für immer bestehen. Wenn sich das Problem wiederholt, wird innerhalb weniger Minuten ein Dialogfeld angezeigt. Wenn Ihr Gerät Bluetooth LE-Werbung oder BLE überhaupt nicht unterstützt, stürzt es einfach ab. (Es ist nur eine schnelle und schmutzige Test-App.)
Eine weitere einfache Möglichkeit, dies zu reproduzieren, besteht darin, die App "bluetoothadvertiser" von @ aus auszuführehttps: //github.com/devunwired/accessory-sample und tippen Sie kurz auf die Schaltfläche "Werbung aktualisieren" auf der Benutzeroberfläche.
Zusätzliche Details
Die Unterstützung für den Bluetooth LE-Peripheriemodus (für Werbung erforderlich) wurde in Lollipop hinzugefügt und ist in Version 4.x nicht verfügbar. Nur bestimmte Geräte unterstützen den Peripheriemodus. Kompatibilität wird mindestens abgedeckt in:
https: //altbeacon.github.io/android-beacon-library/beacon-transmitter-devices.htm Chipsätze / Geräte, die den Android 5 BLE-Peripheriemodus unterstützen chipsets, die die BLE-Peripherierolle auf Android 5 unterstützen
Zum Beispiel sollten diese Geräte die Unterstützung haben: Motorola Moto E 4G (2015), Motorola Moto G 4G (2. Generation), Sony Xperia M4 Aqua, ZTE Blade S6, Motorola Moto X (2014), Samsung Galaxy S6, Google Nexus 6, Google Nexus 9, HTC One M9, Samsung Galaxy S6 Edge.
Wie für die "schmutzigen Details" kann ich in LogCat immer eine "GKI_Exception" sehen, bevor dies passiert:
GKI_exception (): 65524 getbuf: out of puffers
Bald nach der ersten "GKI_Exception" schlägt die Werbung mit AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR fehl. Die Linie..
E / BtGatt.btif? ### ASSERT: external / bluetooth / bluedroid / main /../ btif / src / btif_gatt_client.c Zeile 803 Kontextübertragung fehlgeschlagen! (3) ##
... ist wahrscheinlich relevant, aber ich kenne mich mit BlueDroid nicht aus. Die besagte Behauptung ist hier:
Einige möglicherweise verwandte Probleme:
https: //code.google.com/p/android/issues/detail? id = 65455 <- Ich habe diesem einige Kommentare und Protokolldateien hinzugefügt.
https: //code.google.com/p/android-developer-preview/issues/detail? id = 1753
Scannen einer großen Anzahl von BLE-Tags
Bluetooth Crash auf Samsung S4