Android 6中,蓝牙低功耗连接参数管理方式似乎已经发生了变化。
我有一个需要使用一些特定连接参数的BLE外设设备(特别是连接间隔),我想使用BLE规范允许的最小连接间隔(即7.5毫秒)。
Android SDK不允许从BLE GAP Central(智能手机)端选择它,因此正确的方法是在GAP Peripheral设备发送L2CAP Connection Parameter Update请求后进行设置。
我请求的参数是:
- conn interval min : 7.5ms
- conn interval max : 7.5ms
- slave latency : 0
- supervision timeout : 2000ms
这个方法在我测试过的所有Android设备上都可以正常工作,从4.3到5.x。发送L2CAP Connection Parameter Update请求后,我的设备收到了一个L2CAP Connection Parameter Update响应,其中包含0x0000(被接受),接着又接收到一个LE Connection Update Complete event,在这里我可以看到所请求的连接参数已经被成功地采用了。
但是,在Nexus 9平板电脑或两台不同的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(保持其他参数不变)。以下是我的发现:
- 使用最大连接间隔为18.75ms时,接受更新请求并将间隔设置为18.75ms。
- 使用最大连接间隔为17.50ms时,接受更新请求并将间隔设置为15.00ms。
- 使用最大连接间隔为15.00ms时,接受更新请求并将间隔设置为15.00ms。
- 使用最大连接间隔为13.75ms时,接受更新请求并将间隔设置为11.25ms。
- 使用最大连接间隔为11.25ms时,接受更新请求并将间隔设置为11.25ms。
- 对于任何小于11.25ms的其他最大连接间隔值,我都会被拒绝。
因此,观察到Android 6的BLE堆栈处理连接参数的方式明显发生了变化。但似乎没有任何信息或文档来证实这一点。
我的观察结论是,现在允许的最小连接间隔为11.25ms(实际上符合我的需求),而之前的Android版本中是7.5ms。但是找到经验性的结果后,我想确定我是否漏掉了其他约束/规则,或者该最小值是否不会是动态的,例如依赖于当前电池电量......
最好的情况是拥有类似于苹果蓝牙设计指南(第3.6节)的东西,以澄清LE外围设备应如何处理此主题。
是否有人遇到同样的问题或知道谷歌提供更多有用信息?