当前位置:  开发笔记 > Android > 正文

Android 6.0 Marshmallow BLE:连接参数

如何解决《Android6.0MarshmallowBLE:连接参数》经验,为你挑选了2个好方法。

在Android 6中,蓝牙低功耗连接参数管理似乎已经发生了变化.

我有一个BLE外围设备需要使用一些特定的连接参数(特别是连接间隔),我想使用BLE规范允许的最小连接间隔(即7,5ms).

Android SDK不允许从BLE GAP Central(智能手机)端选择它,因此正确的方法是让我的GAP外围设备L2CAP Connection Parameter Update Request在建立GAP连接后发送.

我要求的参数是:

conn interval min:7,5ms

conn interval max:7,5ms

奴隶潜伏期:0

监督超时:2000ms

这与我一直在测试的所有Android设备一样工作,从4.3到5.x:发送后L2CAP Connection Parameter Update Request,我的设备收到一个L2CAP Connection Parameter Update Response0x0000(接受),然后LE Connection Update Complete event我可以看到所请求的连接参数已经很好了考虑到了.

现在,使用Nexus 9平板电脑或2个不同的Nexus 5设备,都拥有Android 6.0.1,我可以看到它L2CAP Connection Parameter Update Request总是被拒绝(我收到的是L2CAP Connection Parameter Update Response0x0001(拒绝)).然后我收到一个LE Connection Update Complete event我可以看到所请求的连接参数未被考虑的地方.

我一直在尝试使用外设方面的两种不同的实现(一种是使用ST Microelectronics的BlueNRG,一种是使用Nordic Semiconductor的nRF52),两者的结果完全相同.

然后,经过更多的测试:我尝试了不同的参数集,更改了conn interval max(我保持其他参数相同).这是我发现的:

如果conn interval max = 18.75ms,则接受更新请求,间隔设置为18.75ms

如果conn interval max = 17.50ms,则接受更新请求,间隔设置为15.00ms

如果conn interval max = 15.00ms,则接受更新请求,间隔设置为15.00ms

如果conn interval max = 13.75ms,则接受更新请求,间隔设置为11.25ms

如果conn interval max = 11.25ms,则接受更新请求,间隔设置为11.25ms

如果任何其他conn间隔最大值低于11.25ms,我会被拒绝.

所以观察到Android 6的BLE堆栈处理连接参数的方式已经明显改变了.但似乎没有任何形式的信息或文件来证实这一点.

我的观察得出结论,允许的最小连接间隔现在是11.25ms(这实际上符合我的需要),而不是早期Android版本中的7.5ms.但是根据经验发现,我想确定我没有错过其他一些约束/规则,或者这个最小值是不是动态的,这取决于例如当前的电池电量......

最好的方法是使用相当于Apple的蓝牙设计指南(参见§3.6)来明确LE外设应该如何处理这个主题.

是否有人遇到过同样的问题,或者是否知道Google提供的更多有用信息?



1> GPS..:

比较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代码的任何部分是否控制与外围设备协商的结果.



2> 小智..:

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的Nexus 6上运行的

显然,Android 6 BLE堆栈上发生了一些非常奇怪的事情。

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有