我正在构建一个针对5.0+的Android应用,它使用BLE连接到多个外围设备。这些外围设备中的每一个都具有许多(~10)特性。理想情况下,我想订阅这些特征中每一个特征的变化通知。
然而,我从阅读中理解的是,Android的蓝牙实施对可以激活的同时通知的数量实施了硬性限制。 This question标识了Android蓝牙implementation中定义限制的位置,并且还记录了限制随时间的变化情况:
最多并发活动通知(
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个通知。到目前为止,我已经观察到了这一点:
这些通知订阅通过两项措施取得成功:
GATT_SUCCESS
; 这是好消息。一方面,更多“真实”通知==>少手动轮询==>更好的用户体验。另一方面,无法创建导致“真实”通知设置失败的条件意味着我无法轻松编写或测试手动回退代码,一旦将此应用程序发布给真实用户,肯定会(?)需要。 / p>
答案 0 :(得分:5)
API的设计非常糟糕。事实上,这个实现使用固定大小的数组而不是动态数组,这可能是用C语言编写库时的遗留问题。
当内部C ++库无法分配通知条目时,实际上returns an error。遗憾的是,该错误仅被记录,并且不会传播到使用应用程序(source)的Java层。这意味着开发人员无法确定(在代码中)何时达到限制。
无论如何,BTA_GATTC_NOTIF_REG_MAX
限制是每BluetoothGatt
个对象,因此如果连接了另一个应用,则不应干扰您的通知注册。您甚至可以在同一个应用程序中连接到同一设备的两个BluetoothGatt
个对象,这样就可以获得两倍的通知注册位置。
最大插槽数定义为here。由于制造商可以自由地更改此值,因此操作系统级别是定义此值的唯一方法是不正确的。例如,我知道三星在他们的一些设备中增加了最大连接数(否则硬编码为7),因此他们也可能增加了这个值。
我无法解释您是如何成功订阅Google手机上超过15个通知的。您是在一台设备上还是在多台设备上配置了超过15个通知?