Bluetooth Low Energy接続パラメーターの管理は、Android 6。
特定の接続パラメーター(特に、接続間隔)を使用する必要があるBLE周辺機器があり、BLE仕様で許可されている最小接続間隔(7,5ms)を使用します。
Android SDKはBLE GAP Central(スマートフォン)側から選択することを許可していないため、適切な方法は、GAP周辺機器がGAPの後にL2CAP Connection Parameter Update Request
を送信することです。接続が確立されます。
私が要求するパラメーターは次のとおりです。
これは、テストしたすべての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で、Nordic SemiconductorのnRF52で1つ)でこれを試しましたが、どちらもまったく同じ結果になりました。
その後、さらにテストした後、さまざまなパラメーターセットを試して、conn interval maxを変更しました(他のパラメーターは同じままにしました)。ここに私が見つけたものがあります:
したがって、観察結果は、Android 6のBLEスタックが接続パラメーターを処理する方法で何かが明らかに変更されたということです。しかし、それを確認するための情報や文書はありません。
私の観察では、許容される最小接続間隔は以前のAndroid=バージョンでの7.5msではなく、実際には私のニーズに合った)11.25msであるという結論に至りました。他のいくつかの制約/ルールを見逃していないこと、または現在のバッテリーレベルに応じてその最小値が動的ではないことを確認したい...
LEペリフェラルがこのトピックをどのように扱うべきかを明確にするために、 AppleのBluetoothデザインガイドライン (cf.§3.6)と同等のものを用意することは素晴らしいことです。
同じ問題を抱えている人や、Googleからのさらに役立つ情報を知っている人はいますか?
AOSP 6.0.1_r17とAOSP 5.1.1_r14のGattService.JavaのメソッドconnectionParameterUpdate()を比較します。どちらの場合も、呼び出しは同じパラメーターで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に切り替わらない理由は推測できません。 Androidコードが周辺機器との交渉の結果を制御するかどうかはわかりません。
Googleは、Android 6に明確にいくつかあるにもかかわらず、接続パラメーターの変更に関するBluetooth LEスタックの変更に関するドキュメントを提供していません。
私の経験はあなたのものと同じでした。つまり、11.25msはAndroid 6+。
ドキュメントをリリースしない理由についての私の推測では、多くのメーカーが独自のBLEスタックを携帯電話に搭載しています(SamsungとHTCのBLEはVanilla Androidとは異なる動作をします)。
私が多くの問題を引き起こしたもう1つの観察結果は、Android 6+は接続パラメーターを2から6回変更してから、要求されたパラメーターを確定するということです。
800ミリ秒から1100ミリ秒の接続パラメーターの更新間隔を要求した後、最初の間隔が7.5ミリ秒に戻って、48.75ミリ秒にジャンプしてから、要求した1098.75ミリ秒にジャンプしたことがわかりました。次に、サービスの1つで通知をサブスクライブしましたが、接続間隔が再び7.5ミリ秒に戻り、1098.75ミリ秒に戻りました。この後、接続中は1098.75msで安定しました。
これらのテストは、Nexus 6でAndroid 6.0.1
明らかに、非常に奇妙なことが、Android 6 BLEスタックで発生しています。
Googleのスタッフは、BTM_BLE_CONN_INT_MIN_LIMIT
を0x0009
として定義することで1.25ms x 9 = 11.25msを与えることにより、Bluedroidの最近のコミットの1つでミスを犯しました。標準に準拠するには、0x0006
として定義する必要があります。
11.25 msは、新しい最小接続間隔です。彼らが7.5ミリ秒をもう許可しないのは、オーディオをBluetooth経由で同時にストリーミングすると、オーディオが途切れる可能性があるためです。