Android 蓝牙低功耗特性通知计数限制:这是否因设备而异?

2024-05-09

Context

我正在构建一个针对 5.0+ 的 Android 应用程序,它使用 BLE 连接到多个外围设备。这些外设中的每一个都有许多(~10)个特性。理想情况下,我想订阅这些特征中每一项的更改通知。

然而,我从阅读中了解到,Android 的蓝牙实现对可以激活的同时通知的数量强制执行硬性限制。这个问题 https://stackoverflow.com/a/37756809/2911458识别 Android 蓝牙中定义限制的位置执行 https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/master/bta/gatt/bta_gattc_int.h#345,并且还记录了限制如何随时间变化:

最大并发活动通知(BTA_GATTC_NOTIF_REG_MAX):

  • 4. Android 4.3 上
  • 7 安卓 4.4
  • Android 5.0+ 上为 15

这些数字已得到戴夫·史密斯 (Dave Smith) 的证实其中还建议:

  • 这些限制对于设备来说是全局的(即,如果其他应用程序订阅了 2 个通知,则我的应用程序可用的数量将减少 2 个);
  • 这些限制不应因 Android 操作系统级别以外的任何因素而变化(即它们应独立于制造商、实际硬件功能等)

Problem

然而,在 5.0+ 设备上的测试中,我发现我显然能够成功订阅more超过 15 条通知。到目前为止,我已经观察到这一点:

  • Pixel XL 运行 7.1.1
  • Galaxy S6 运行 6.0.1
  • 运行 5.X 的 Nexus 5

这些通知订阅的成功有两个衡量标准:

  1. GATT 运行状态是GATT_SUCCESS;
  2. 该应用程序能够接收所有目标特征的特征变化通知。

这是好坏参半的消息。一方面,更多“真实”通知==>更少的手动轮询==>更好的用户体验。另一方面,无法创建导致“真实”通知设置失败的条件意味着我无法轻松编写或测试手动回退代码,一旦该应用程序发布给真实用户,肯定需要(?)。

问题

  • 这种忽略限制的行为是预期的吗? (我在其他地方找不到它的描述。)
  • 是否有已知的设备最多可以接收 15 个通知,我可以用它们来测试不愉快的路径?

API 的设计非常糟糕。事实上,这个实现使用固定大小的数组而不是动态数组,这可能是用 C 编写库时遗留下来的。

实际上是内部C++库返回错误 https://android.googlesource.com/platform/system/bt/+/221e9bf6c9e9f974efd92ea4f054dbdba248d2db/bta/gatt/bta_gattc_api.cc#625当它无法分配通知条目时。不幸的是,该错误仅被记录下来,并且不会传播到使用应用程序的 Java 层(source https://android.googlesource.com/platform/packages/apps/Bluetooth/+/3ae219d81403f905ed4efc3b6071acae075e7660/src/com/android/bluetooth/gatt/GattService.java#935)。这意味着开发人员无法(在代码中)确定何时达到限制。

无论如何,BTA_GATTC_NOTIF_REG_MAX限制是每BluetoothGatt对象,因此如果连接了另一个应用程序,它不应干扰您的通知注册。你甚至可以有两个BluetoothGatt同一应用程序中的对象连接到同一设备,这样可以获得双倍的通知注册槽位。

定义最大槽数here https://android.googlesource.com/platform/system/bt/+/221e9bf6c9e9f974efd92ea4f054dbdba248d2db/bta/gatt/bta_gattc_int.h#260。操作系统级别是定义此值的唯一因素是不正确的,因为制造商可以自由更改此值。例如,我知道三星在其某些设备中增加了最大连接数(否则硬编码为 7),因此他们也可能增加了该值。

我无法解释您如何在 Google 手机上成功订阅超过 15 条通知。您是否在一台设备或多台设备上配置了超过 15 个通知?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 蓝牙低功耗特性通知计数限制:这是否因设备而异? 的相关文章

随机推荐