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

stk*_*ent 4 android bluetooth-lowenergy android-bluetooth

上下文

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

但是,我从阅读中理解的是,Android的蓝牙实施对可以激活的同时通知的数量实施了硬性限制.此问题确定了在Android蓝牙实施中定义限制的位置,并且还记录了限制随时间的变化:

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

  • Android 4.3上的4
  • Android 4.4上的7
  • Android 5.0+上的15

Dave Smith在此视频中确认了这些数字,并建议:

  • 这些限制对于设备是全局的(即,如果某个其他应用程序订阅了2个通知,则我的应用程序可用的数量减少2个);
  • 这些限制不应基于Android OS级别以外的任何其他级别(即它们应独立于制造商,实际硬件功能等).

问题

在5.0+设备上进行测试,但是,我发现,我似乎能够成功订阅超过15个通知.到目前为止,我已经观察到:

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

这些通知订阅通过两项措施取得成功:

  1. 关贸总协定的运作状况是GATT_SUCCESS;
  2. 该应用程序能够接收有关所有目标特征的特征变化的通知.

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

问题

  • 是否期望这种限制忽略行为?(我无法在其他地方找到它.)
  • 是否有任何设备已知最多15个通知我可以用来测试不愉快的路径?

Emi*_*mil 7

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

当内部C++库无法分配通知条目时,实际上会返回错误.遗憾的是,该错误仅被记录,并且不会传播到使用应用程序()的Java层.这意味着开发人员无法确定(在代码中)何时达到限制.

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

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

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

  • 注意最大BluetoothGatt对象的限制,在当前的Android版本中,该限制在全球范围内为32。可能由于内部使用而减少。 (2认同)
  • 是。在这里设置:https://android.googlesource.com/platform/system/bt/+/f6d79c5d6c9cc829dcfa033d59bade4d83334df7/include/bt_target.h#737 (2认同)