返回

BLE 中如何正确处理多个符读取?

Android

使用 GATT onDescriptorRead 正确处理多个符读取

简介

在蓝牙低能耗(BLE)连接中,通过 onServicesDiscovered 回调获取设备的服务后,经常需要读取符以获取有关服务或特征的附加信息。在默认情况下,Android BLE API 会将描述符读取请求排队,导致 onDescriptorRead 回调只被调用一次,而不是描述符的数量次。

问题

当我使用以下循环逐个读取描述符时:

for (int n=0;n<descriptors.size();n++) {
    gatt.readDescriptor(descriptors.get(n));
}

onDescriptorRead 回调只被调用了一次。

解决方法

为了解决这个问题,可以使用 gatt.readDescriptor(BluetoothGattDescriptor, int) 方法中的第二个参数 transport 来指定传输类型。使用 GATT.TRANSPORT_LE 值将强制立即执行读取请求,而无需排队。

更新后的代码如下:

for (int n=0;n<descriptors.size();n++) {
    gatt.readDescriptor(descriptors.get(n), GATT.TRANSPORT_LE);
}

使用 getServices() 获取描述符

建议使用 gatt.getServices() 而不是 gatt.getDescriptors() 来获取设备的描述符。getServices() 返回一个服务列表,然后你可以在这些服务中查找描述符。

结论

通过使用 GATT.TRANSPORT_LE,可以确保所有描述符读取请求都立即执行,并且 onDescriptorRead 回调将被相应地调用。

常见问题解答

  • 为什么 onDescriptorRead 回调只被调用一次?

    • 默认情况下,Android BLE API 会将描述符读取请求排队,导致一次只执行一个请求。
  • 如何强制立即执行描述符读取请求?

    • 使用 gatt.readDescriptor(BluetoothGattDescriptor, int) 方法中的第二个参数 transport 来指定传输类型 GATT.TRANSPORT_LE
  • 使用 getServices() 获取描述符有什么好处?

    • getServices() 返回一个服务列表,然后你可以在这些服务中查找描述符,更直观更方便。
  • 如何正确地处理多个描述符读取?

    • 使用 gatt.readDescriptor(BluetoothGattDescriptor, int) 方法,并指定传输类型 GATT.TRANSPORT_LE
  • 为什么 getDescriptors() 不建议用于获取描述符?

    • getDescriptors() 返回的是一个所有描述符的列表,而 getServices() 返回一个服务列表,然后你可以在这些服务中查找描述符,更直观更方便。