Android 6.0 Marshmallow BLE : Verbindungsparameter
Bluetooth Low Energy-Verbindung-Parameter-management scheint sich verändert zu haben im Android 6.
Habe ich eine BLE-Peripheriegerät, das mithilfe einige spezifische Verbindungsparameter (vor allem, die Verbindung Intervall), und ich möchte die minimale Anschluss-Intervall erlaubt die BLE-Spezifikation (D. H. 7,5 ms).
Dem Android SDK nicht erlauben, wählen Sie es aus der BLE-zentrale LÜCKE (auf dem smartphone) Seite, so ist der richtige Weg, es zu tun ist, um meine LÜCKE Peripheriegerät senden Sie eine L2CAP Connection Parameter Update Request
nach der LÜCKE-Verbindung hergestellt ist.
Die Parameter, die ich Anfrage sind:
- conn Intervall min : 7,5 ms
- conn Intervall max : 7,5 ms
- slave latency : 0
- überwachung timeout : 2000ms
Diese wie erwartet funktioniert mit allen Android-Geräten, die ich habe testen, von 4.3 auf 5.x : nach dem senden der L2CAP Connection Parameter Update Request
mein Gerät erhält eine L2CAP Connection Parameter Update Response
mit 0x0000 (angenommen), gefolgt von einem LE Connection Update Complete event
wo kann ich sehen, dass die angeforderten Verbindungsparameter haben, auch berücksichtigt wurden.
Nun mit einem Nexus 9 tablet oder mit 2 verschiedenen Nexus-5-Geräte, alle mit Android 6.0.1, ich kann sehen, dass die L2CAP Connection Parameter Update Request
immer abgelehnt (ich erhalte eine L2CAP Connection Parameter Update Response
mit 0x0001 (abgelehnt)). Dann bekomme ich einen LE Connection Update Complete event
wo kann ich sehen, dass die angeforderten Verbindungsparameter wurden NICHT berücksichtigt.
Ich habe versucht dies mit 2 verschiedenen Implementierungen auf der Peripheren Seite (mit ST Microelectronics, die BlueNRG, mit Nordic Semiconductor nRF52), beide mit dem exakt gleichen Ergebnis.
Dann, nach weiteren Tests : ich habe versucht, verschiedene parameter-sets, die änderung der conn-Intervall max (ich hielt die anderen Parameter gleich sind). Hier ist was ich gefunden habe :
- mit conn-Intervall max = 18.75 ms, update-Anfrage wurde akzeptiert mit Intervall einstellen, bis 18,75 ms
- mit conn-Intervall max = 17.50 ms, update-Anfrage wurde akzeptiert mit Intervall eingestellt, um 15.00 ms
- mit conn-Intervall max = 15.00 ms, update-Anfrage wurde akzeptiert mit Intervall eingestellt, um 15.00 ms
- mit conn-Intervall max = 13.75 ms, update-Anfrage wurde akzeptiert mit Intervall festlegen zu 11,25 ms
- mit conn-Intervall max = 11.25 ms, update-Anfrage wurde akzeptiert mit Intervall festlegen zu 11,25 ms
- mit anderen conn Intervall max-Wert unterhalb von 11.25 ms, bekomme ich abgelehnt.
Also die Beobachtung ist, dass etwas, das sich deutlich verändert hat mit der Art, wie Android-6-BLE-stack verarbeitet die Parameter der Verbindung. Aber es scheint nicht zu sein jede Art von information oder Dokumentation, um zu bestätigen, dass.
Meine Beobachtungen führen zum Schluss, dass die minimale Anschluss-Intervall erlaubt ist, ist jetzt 11.25 ms (was eigentlich genau meinen Anforderungen) anstelle von 7.5 ms in früheren Android-Versionen. Aber gefunden haben Sie empirisch, ich würde wollen, um sicher zu sein, dass ich nicht bin fehlen einige andere Einschränkungen/Regeln oder, wenn das minimum nicht dynamisch sein, je nachdem, zum Beispiel über den aktuellen Akkustand...
Was toll wäre, wäre äquivalent zu Apples Bluetooth-Design-Richtlinien (vgl. §3.6), um die Dinge klar auf, wie eine LE Peripheren sollte sich mit diesem Thema beschäftigen.
Ist jemand mit dem gleichen Problem oder ist bewusst, dass einige mehr hilfreiche Informationen von Google ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Compare-Methode connectionParameterUpdate() aus GattService.java in AOSP 6.0.1_r17 vs AOSP 5.1.1_r14. In beiden Fällen, rufen Sie geht den ganzen Weg zu Buedroid in BTA_DmBleUpdateConnectionParams() in bta_dm_api.c mit gleichen params.
6.0:
5.1:
Könnte dies ein Teil der Antwort auf Ihre Frage. Obwohl BLE ermöglicht runter auf 7,5 ms CI, ich kann nicht spekulieren, warum die link-layer-würde nicht wechseln, um den unteren CI auf Anfrage von peripheren. Ich weiß nicht, ob jeder Teil der android-code-Steuerelemente Ergebnis der Verhandlungen mit dem peripheren Gerät.
Google hat keine Dokumentation über die Bluetooth LE stack-änderungen bezüglich der Verbindung parameter verändert, obwohl es deutlich einige in Android 6.
Meine Erfahrung mit Ihr wurde das gleiche wie Ihre eigenen, ist, dass 11.25 ms ist jetzt die Schnellste Verbindung Intervall erlaubt in Android 6+.
Meine Vermutung, warum Sie keine Freigabe für die Dokumentation ist, dass viele Hersteller stellen Ihre eigenen BLE-stacks in Ihre Handys (die BLE auf Samsung und HTC Verhalten sich anders als vanilla Android).
Eine andere Beobachtung die ich gemacht habe, dass verursacht eine Menge Probleme, dass Android 6+ ändern Sie die Verbindungs-Parameter 2 bis 6 mal, bevor Sie sich auf die gewünschten Parameter.
Habe ich beobachtet, dass nach dem anfordern einer Verbindung parameter update-Intervall von 800ms auf 1100ms, sah ich den ersten Intervall wieder kommen bei 7,5 ms, dass dann sprang 48.75 ms und sprang dann auf die 1098.75 ms habe ich beantragt. Dann habe ich abonniert, um Benachrichtigungen auf einem meiner Dienste und der Verbindung Intervall wieder sprang Sie zurück auf 7.5 ms und dann wieder zu 1098.75 ms. Nach dieser, es stabilisiert sich auf 1098.75 ms für die Dauer der Verbindung.
Diese Prüfungen wurden auf einem Nexus 6 mit Android 6.0.1
Offensichtlich, einige sehr seltsame Dinge geschehen auf der Android 6 BLE-stack.
11.25 ms ist das neue minimum-Verbindung Intervall. Der Grund, warum Sie nicht zulassen, 7.5 ms mehr ist, weil wenn Sie das Streaming von audio über bluetooth zur gleichen Zeit die audio-möglicherweise wurde abgehackt.
Google-Jungs einen Fehler gemacht, in einem der letzten commits in Bluedroid durch die Definition
BTM_BLE_CONN_INT_MIN_LIMIT
als0x0009
die Ihnen 1,25 ms x 9 = 11.25 ms. Im Einklang mit den standard-es muss definiert werden, wie0x0006
.