在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
始终被拒绝(我收到L2CAP Connection Parameter Update Response
0x0001 (被拒绝))。然后我收到一个LE Connection Update Complete event
,我可以看到所请求的连接参数没有被考虑在内。
我一直在尝试使用Peripheral方面的两种不同的实现(一种是使用ST Microelectronics的BlueNRG,另一种是使用Nordic Semiconductor的nRF52),两者都具有完全相同的结果。
然后,经过更多测试:我尝试了不同的参数集,更改conn interval max(我保持其他参数相同)。这是我发现的:
因此观察到Android 6的BLE堆栈处理连接参数的方式已经明显改变了。但似乎没有任何形式的信息或文件来证实这一点。
我的观察得出结论,允许的最小连接间隔现在是11.25ms(实际上符合我的需要),而不是早期Android版本中的7.5ms。但是根据经验找到它,我想确定我没有错过其他一些约束/规则,或者这个最小值是不是动态的,这取决于例如当前的电池电量......
如果有Apple's Bluetooth Design Guidelines(参见§3.6)相当于LE外围设备应如何处理这一主题,那将会是多么美妙。
是否有人遇到过同样的问题,或者是否知道Google提供的更多有用信息?
答案 0 :(得分:10)
比较AOSP 6.0.1_r17中的GattService.java与AOSP 5.1.1_r14中的方法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.5毫秒CI,但我不能推测为什么链路层不会在外设请求时切换到较低的CI。我不知道android代码的任何部分是否控制与外围设备协商的结果。
答案 1 :(得分:5)
Google未提供有关蓝牙LE堆栈更改的任何有关连接参数更改的文档,即使Android 6中已有明显更改。
我使用它的经验与您自己的相同,即11.25ms现在是Android 6 +中允许的最快连接间隔。
我对他们为什么不发布文档的猜测是,许多制造商将他们自己的BLE堆栈放入他们的手机中(三星和HTC上的BLE与香草Android的行为不同)。
我做的另一个观察结果导致了很多问题,Android 6+会在确定所请求的参数之前将连接参数更改2到6次。
我观察到在请求连接参数更新间隔为800ms到1100ms之后,我看到初始间隔恢复到7.5ms,然后跳到48.75ms然后跳到我请求的1098.75ms。然后我订阅了我的一个服务的通知,连接间隔再次跳回到7.5毫秒然后回到1098.75ms。在此之后,它在连接期间稳定在1098.75ms。
这些测试是在带有Android 6.0.1的Nexus 6上运行的
显然,Android 6 BLE堆栈上发生了一些非常奇怪的事情。
答案 2 :(得分:1)
Google家伙在最近的Bluedroid提交中犯了一个错误,将BTM_BLE_CONN_INT_MIN_LIMIT
定义为0x0009
,它给你1.25毫秒x 9 = 11.25毫秒。为了符合标准,必须将其定义为0x0006
。
答案 3 :(得分:1)
11.25 ms是新的最小连接间隔。他们不再允许7.5毫秒的原因是因为如果你通过蓝牙流式传输音频,音频可能会变得不连贯。