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

时间:2017-03-13 19:28:48

标签: android bluetooth-lowenergy android-bluetooth

上下文

我正在构建一个针对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中确认了这些数字,并建议:

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

问题

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

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

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

  1. GATT操作状态为GATT_SUCCESS;
  2. 该应用能够接收有关所有目标特征的特征变化的通知。
  3. 这是好消息。一方面,更多“真实”通知==>少手动轮询==>更好的用户体验。另一方面,无法创建导致“真实”通知设置失败的条件意味着我无法轻松编写或测试手动回退代码,一旦将此应用程序发布给真实用户,肯定会(?)需要。 / p>

    问题

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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