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

Android Bluetooth Low Energy Characteristic notification count limit: does this vary by device?

上下文

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

但是,我从周围阅读的理解是 Android 的蓝牙实现对可以同时激活的通知数量强制执行了硬性限制。 This question identifies where the limit is defined within the Android Bluetooth implementation,并且还注意到限制是如何随时间变化的:

Max concurrent active notifications (BTA_GATTC_NOTIF_REG_MAX):

  • 4 on Android 4.3
  • 7 on Android 4.4
  • 15 on Android 5.0+

这些数字已由 Dave Smith 在 video 中确认,其中还建议:

问题

然而,在 5.0+ 设备上进行测试时,我发现我显然能够成功订阅 比 15 个通知更多。到目前为止,我已经观察到这一点:

这些通知订阅通过两种方式获得成功:

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

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

问题

API 设计得很糟糕。这个实现使用固定大小数组而不是动态数组这一事实可能是用 C 语言编写库时的遗留问题。

实际上是内部 C++ 库 returns an error when it fails to allocate a notification entry. Unfortunately that error is only logged and is not propagated to the Java layer of the consuming application (source)。这意味着开发人员无法确定(在代码中)何时达到限制。

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

插槽的最大数量已定义 here。 OS 级别是唯一定义此值的说法是不正确的,因为制造商可以自由更改此值。例如,我知道三星在他们的一些设备中增加了最大连接数(否则硬编码为 7),因此他们也可能增加了这个值。

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