返回
BLE 中如何正确处理多个符读取?
Android
2024-03-29 04:41:06
使用 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()
返回一个服务列表,然后你可以在这些服务中查找描述符,更直观更方便。