gpt4 book ai didi

Android 6.0 棉花糖 BLE : Connection Parameters

转载 作者:IT老高 更新时间:2023-10-28 21:47:06 29 4
gpt4 key购买 nike

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

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

Android SDK 不允许从 BLE GAP Central(智能手机)端选择它,所以正确的做法是让我的 GAP 外围设备发送 L2CAP 连接参数更新请求 GAP 连接后。

我要求的参数是:

  • 最小连接间隔:7.5ms
  • 最大连接间隔:7.5ms
  • 从属延迟:0
  • 监管超时:2000ms

这在我测试过的所有 Android 设备(从 4.3 到 5.x)都可以正常工作:发送 L2CAP 连接参数更新请求 后,我的设备会收到 L2CAP 连接参数使用 0x0000(已接受)更新响应,然后是 LE 连接更新完成事件,我可以看到请求的连接参数已得到充分考虑。

现在,使用 Nexus 9 平板电脑或 2 台不同的 Nexus 5 设备,都具有 Android 6.0.1,我可以看到 L2CAP 连接参数更新请求 总是被拒绝(我收到一个L2CAP 连接参数更新响应 with 0x0001 (rejected))。然后我收到一个 LE 连接更新完成事件,我可以看到请求的连接参数没有被考虑在内。

我在外设端尝试了两种不同的实现方式(一种使用 ST Microelectronics 的 BlueNRG,一种使用 Nordic Semiconductor 的 nRF52),结果完全相同。

然后,经过更多测试:我尝试了不同的参数集,改变了 conn 间隔最大值(我保持其他参数相同)。这是我发现的:

  • conn 间隔 max = 18.75ms,更新请求被接受,间隔设置为 18.75ms
  • conn 间隔 max = 17.50ms,更新请求被接受,间隔设置为 15.00ms
  • conn 间隔 max = 15.00ms,更新请求被接受,间隔设置为 15.00ms
  • conn 间隔 max = 13.75ms,更新请求被接受,间隔设置为 11.25ms
  • conn 间隔 max = 11.25ms,更新请求被接受,间隔设置为 11.25ms
  • 如果任何其他 conn 间隔最大值低于 11.25 毫秒,我都会被拒绝。

因此观察到,Android 6 的 BLE 堆栈处理连接参数的方式明显发生了变化。但似乎没有任何信息或文件可以证实这一点。

我的观察得出的结论是,现在允许的最小连接间隔为 11.25 毫秒(实际上符合我的需要),而不是早期 Android 版本中的 7.5 毫秒。但是根据经验找到它后,我想确保我没有遗漏一些其他约束/规则,或者该最小值是否不是动态的,例如取决于当前的电池电量......

如果有 Apple's Bluetooth Design Guidelines 的等价物,那就太好了。 (cf. §3.6) 明确 LE Peripheral 应如何处理此主题。

是否有人遇到同样的问题或知道 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.5 毫秒的 CI,但我无法推测为什么链路层不会根据外围设备的请求切换到较低的 CI。我不知道android代码的任何部分是否控制与外围设备协商的结果。

关于Android 6.0 棉花糖 BLE : Connection Parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34617061/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com