31

のBluetooth低エネルギー接続パラメータ管理は私が(特に接続間隔)をいくつかの特定の接続パラメータを使用する必要があるBLE周辺機器を持っているアンドロイド6にアンドロイド6.0マシュマロBLE:接続パラメータ

を変更しているようですBLE仕様で許容される最小接続間隔(つまり7,5ms)を使用したいと考えています。

Android SDKでは、BLE GAP Central(スマートフォン)側から選択することはできません。GAP接続後に、GAP周辺機器にL2CAP Connection Parameter Update Requestを送信するのが適切な方法です。私が要求

パラメータは次のとおり

  • CONN間隔分:7,5ms
  • スレーブ待ち時間:0
  • 監視タイムアウト:2000ミリ秒
  • CONN間隔最大7,5ms

    これは私がテストしたすべてのAndroid搭載端末(4.3から5.x)で期待通りに機能しました:L2CAP Connection Parameter Update Requestを送信した後、私のデバイスはL2CAP Connection Parameter Update Responseと0x0000(受け入れられた)とそれに続くLE Connection Update Complete eventを受け取り、要求された接続パラメータが十分に考慮されていることがわかります。 Nexus 9のタブレットでまたは2つの異なるNexus 5のデバイスと今

    、すべてのAndroid 6.0.1を持つ、私はL2CAP Connection Parameter Update Requestは常に(私は0x0001に(拒否)とL2CAP Connection Parameter Update Responseを受ける)拒否されたことがわかります。その後、私はLE Connection Update Complete eventを受け取り、要求された接続パラメータが考慮されていないことがわかります。

    私はPeripheral側で2つの異なる実装(ST MicroelectronicsのBlueNRGと1つ、Nordic SemiconductorのnRF52と1つ)でこれを試してきましたが、どちらも全く同じ結果でした。

    次に、より多くのテストを行った後、私はconn interval maxを変更して、別のパラメータセットを試しました。 CONN間隔最大= 18.75ms、と

    • を更新要求が15.00に間隔を設定して承認されたCONN間隔最大= 17.50ms、更新要求で
    • を18.75msするために設定された間隔で受け入れられた。ここで私が見つけたものですMS
    • CONN間隔最大= 15.00msは、更新要求はCONN間隔最大= 13.75msで
    • を15.00msする間隔セットで受け入れられた、更新要求はCONN間隔最大と
    • を11.25msするために設定された間隔で受け入れられました= 11.25ms、更新要求は11.25msに設定された間隔で受け入れられました
    • 他のconn間隔の最大値が11.25ms未満の場合、私は拒否されます。

    したがって、Android 6のBLEスタックが接続パラメータを処理する方法が明らかに変化していることがわかります。しかし、それを確認するための情報や書類はないようです。

    私の所見から、許容される最小接続間隔は11になったという結論に達しました。以前のAndroidバージョンで7.5msではなく25ms(実際には私のニーズに合っています)。しかし

    ...私はその最小値は、現在のバッテリレベルで、たとえばによっては、ダイナミックではない場合、私はいくつかの他の制約/ルールを欠落しているかいないよということを確認したいと思い、経験的にそれを見つけた何だろうLEペリフェラルがどのようにこのトピックを扱うべきかを明確にするためには、Apple's Bluetooth Design Guidelines(§3.6参照)に相当するものを持つことが大切です。

    同じ問題を抱えている人や、Googleからのより役立つ情報を知っている人はいますか?

  • 答えて

    4

    Googleが接続パラメータに関する変更をスタックのBluetooth LEについてのドキュメントを提供していませんが、明らかにそれとAndroidの6の一部

    私の経験があることということを、自分自身と同じがあったされているにもかかわらず変更します11.25msはAndroid 6以降で最速の接続間隔になりました。

    多くのメーカーが自分のBLEスタックを自分の携帯電話に入れているということを私が推測しています(サムスンとHTCのBLEはバニラのAndroidとは異なる動作をします)。問題の多くを引き起こし、私が作った

    もう一つの観察は、Android 6+が要求されたパラメータにセトリングする前に、接続パラメータに2〜6回に変更するということです。

    800msから1100msの接続パラメータの更新間隔を要求した後、最初の間隔が7.5msに戻ってから48.75msにジャンプし、次に要求した1098.75msにジャンプしたことがわかりました。その後、私のサービスの通知を購読し、接続間隔が再び7.5msに戻り、1098.75msに戻った。その後、接続期間中、1098.75msで安定しました。

    これらのテストは明らかに

    のAndroid 6.0.1でネクサス6上で実行された、いくつかの非常に奇妙なことは、Android 6 BLEスタック上に起こっています。

    9

    はAOSP 5.1.1_r14対AOSP 6.0.1_r17にGattService.javaから方法connectionParameterUpdate()を比較します。どちらの場合も、callは、同じパラメータでbta_dm_api.cのBTA_DmBleUpdateConnectionParams()でBuedroidに移動します。

    6.0:

    switch (connectionPriority) 
        { 
         case BluetoothGatt.CONNECTION_PRIORITY_HIGH: 
          minInterval = 9; // 11.25ms 
          maxInterval = 12; // 15ms 
          break; 
    
         case BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER: 
          minInterval = 80; // 100ms 
          maxInterval = 100; // 125ms 
          latency = 2; 
          break; 
        } 
    

    5.1:

    switch (connectionPriority) 
        { 
         case BluetoothGatt.CONNECTION_PRIORITY_HIGH: 
          minInterval = 6; // 7.5ms 
          maxInterval = 8; // 10ms 
          break; 
    
         case BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER: 
          minInterval = 80; // 100ms 
          maxInterval = 100; // 125ms 
          latency = 2; 
          break; 
        } 
    

    これは、あなたの質問への答えの一部である可能性があります。 BLEは7.5msのCIまで許容していますが、私は、周辺機器からの要求に応じてリンク層が低いCIに切り替わらない理由を推測することはできません。アンドロイドコードの一部が周辺機器との交渉の結果をコントロールしているかどうかは分かりません。

    +0

    私はbtm_ble_api.hにそれを追加したい、BTM_BLE_CONN_INT_MIN [0x0006]とBTM_BLE_CONN_INT_MAX [0x0C80]の値が変更されていません。したがって、この拒否はおそらくl2c_ble.cでは起きていません。 – GPS

    1

    BTM_BLE_CONN_INT_MIN_LIMIT0x0009と定義すると、Googleのメンバーは最近Bluemedroidのコミットで間違いを犯しました。これは1.25ms x 9 = 11.25msになります。標準に準拠するためには、0x0006と定義する必要があります。

    0

    11.25 msは新しい最小接続間隔です。彼らが7.5msをもう許容しない理由は、同時にオーディオをブルートゥースでストリーミングすると、オーディオが不安定になる可能性があるからです。

    +0

    皮肉なことに、私が取り組んでいるプロジェクトでは、周辺機器からオーディオを転送しようとすると、接続間隔が10ミリ秒を超えると音声が途切れてしまいます。主に(おそらく)リンク層が一度に限られた数のパケットを処理できるためです。 – GPS