Android的BLE服务发现(BluetoothGatt#discoverServices())和低能耗与BR / EDR

时间:2015-06-04 21:28:28

标签: android bluetooth-lowenergy android-bluetooth

TLDR:预计通过discoverServices()的服务发现结果会因底层传输(LE与BR / EDR)而有所不同吗?

我有一个混合模式蓝牙配件,提供蓝牙经典设备和蓝牙LE外设等独特功能。

Android无法发现附件的蓝牙LE GATT服务,除非您使用隐藏的peerBluetoothDevice.connectGatt(context, autoConnect, gattCallback, BluetoothDevice.TRANSPORT_LE) API,允许您强制使用TRANSPORT_LETRANSPORT_BREDR

当我通过peerBluetoothDevice.connectGatt(context, autoConnect, gattCallback)连接设备然后调用discoverServices()时,我只发现通用服务UUID(并且只有在许多连接尝试失败且神秘状态133传递到{{3}之后) }})。

  • “00001800-0000-1000-8000-00805f9b34fb”(通用访问)
  • “00001801-0000-1000-8000-00805f9b34fb”(通用属性)。

但是,当我调用隐藏的onConnectionStateChange然后调用discoverServices()时,我得到完整的预期服务发现响应:

  • " XXXXXXXXXXXX-XXXXXXXX-XXXXXXXXXXXX" (我的定制服务)
  • “00001800-0000-1000-8000-00805f9b34fb”(通用访问)
  • “00001801-0000-1000-8000-00805f9b34fb”(通用属性)。

这是预期的Android框架行为(怀疑它,因此隐藏API)?用这种混合模式设计外围设备是不好的形式。操作

1 个答案:

答案 0 :(得分:3)

BluetoothDevice.connectGatt(Context context, boolean autoConnect, android.bluetooth.BluetoothGattCallback callback, int transport)

从API 23开始,

方法是公开的,因此似乎是避免上述问题的制裁方法。

该方法在android-5.0.0_r1版本中似乎已经introduced到AOSP,并且在每个版本中都存在,导致它在API 23中公开。 因此,对于具有API级别21和22的设备,通过反射调用应该是安全的。对于具有先前平台版本的设备,似乎Android框架不提供用于缓解该问题的工具。