上下文
我正在构建一个针对5.0 的Android应用程序,该应用程序使用BLE连接到多个外围设备。这些外围物中的每一个都有许多(〜10)个特征。理想情况下,我想订阅这些特征中的每一个变化的通知。
然而,我从阅读中的理解是,Android的蓝牙实现对可能有效的同时通知的数量进行了严格的限制。这个问题确定了在Android蓝牙实施中定义限制的位置,还指出了限制如何随时间变化:
最大并发活动通知(
BTA_GATTC_NOTIF_REG_MAX
):
- 4 Android 4.3
- 7 Android 4.4
- 15在Android 5.0
上
这些数字在此视频中得到了戴夫·史密斯(Dave Smith)的确认,其中还建议:
- 这些限制是该设备的全球范围(即,如果某些其他应用程序订阅了2个通知,则可用的应用程序的编号将减少2); );
- 这些限制不应根据Android OS级别(即它们独立于制造商,实际硬件功能等)而有所不同)
问题
在5.0 设备上的测试中,我发现我显然能够成功地订阅比15个通知更多。到目前为止,我已经在:
上观察到了这一点- 像素XL运行7.1.1
- Galaxy S6运行6.0.1
- Nexus 5运行5.x
这些通知订阅通过两种措施成功:
- Gatt操作状态是
GATT_SUCCESS
; - 该应用程序能够接收有关所有目标特征的特征变化的通知。
这是混合新闻。一方面,更多的"真实"通知==>较少的手动轮询==>更好的用户体验。另一方面,无法创建导致"真实"通知设置失败的条件,这意味着我无法轻易编写或测试一旦将此应用程序释放给真实用户,肯定需要(?)需要(?)。<<<<<<<<<<<<
问题
- 这种极限定位行为是预期的吗?(我找不到其他地方描述的。)
- 是否有任何可以在15个通知中最大化的设备,我可以用来测试不愉快的路径?
API的设计非常糟糕。只是此实现使用固定大小数组而不是动态数组的事实可能是库写入c。
的遗产。内部C 库实际上返回错误时,当它无法分配通知条目时。不幸的是,该错误仅被记录,并且不会传播到消费应用程序的Java层(源)。这意味着开发人员在达到极限时无法(在代码中)确定(在代码中)。
无论如何,BTA_GATTC_NOTIF_REG_MAX
限制为每个BluetoothGatt
对象,因此,如果连接了另一个应用程序,则不应干扰您的通知注册。您甚至可以在连接到同一设备的同一应用中有两个BluetoothGatt
对象,因此,随着许多通知注册插槽的双倍。
此处定义了最大插槽数。由于制造商可以自由更改此值,因此OS级别是唯一定义此值的东西是不正确的。例如,我知道三星在其某些设备中具有最大连接数(否则硬编码为7),因此它们也可能增加了此值。
我无法解释您如何成功订阅Google手机上的15个以上通知。您是否在单个设备或许多设备上配置了15个以上的通知?