我正在尝试编写BLE Android应用程序。我发现有时候当我调用BluetoothGatt.writeDescriptor()时,它会返回false。
我没有在文档中找到关于此函数的任何限制说明。但是堆栈溢出上的人说,我需要等待BluetoothGattCallback.onDescriptorWrite(),然后再尝试写另一个描述符。
有人回复说BLE正忙,无法进行其他写入操作。
还有另一个线程说,您不能调用两次writeCharacteristic()。
我的问题是:
我没有在文档中找到关于此函数的任何限制说明。但是堆栈溢出上的人说,我需要等待BluetoothGattCallback.onDescriptorWrite(),然后再尝试写另一个描述符。
有人回复说BLE正忙,无法进行其他写入操作。
还有另一个线程说,您不能调用两次writeCharacteristic()。
我的问题是:
- 这是真的吗?
- 是否确实缺少内部android API缓冲区来序列化BLE请求,每个开发人员都必须自己完成它?
- 不同的函数是否也有此限制?例如,当我调用
writeDescriptor()
时,我了解到在收到onDescriptorWrite()
之前,我不能再次调用writeDescriptor()
。但是当我想要调用writeCharacteristic()
时,我是否需要等待onDescriptorWrite()
? - 此外,如果存在互函数依赖性,则还有哪些函数具有此限制(即:
readCharacteristic()
、readDescriptor()
、requestMtu()
...)? - 最后,BluetoothGattServer和BluetoothGatt之间是否存在相互依赖性?因此,例如,当我调用
BluetoothGattServer.notifyCharacteristicChanged()
时,我是否应该等待BluetoothGattServerCallback.onNotificationSent
,然后才能调用BluetoothGatt.writeDescriptor()
或BluetoothGatt.writeCharacteristic()
?(顺便称赞谷歌文档onNotificationSent()
——它已被恰当地记录。文档说:
当要发送多个通知时,应用程序必须等待接收此回调才能发送其他通知。
- 最后,有了所有这些问题,我感到Android BLE API的文档不足。或者我错了,有文档说明允许的方法调用顺序吗?如果是,请指向这样的文档。否则,我们是否可以与谷歌开放问题的渠道并要求将某些内容添加到文档中?我的意思是它可能不需要太多文本——像
onNotificationSent()
这样的函数已经得到了适当的记录。他们只需要将此句子复制到其他功能中。
writeCharacteristic
,则需要在您的BluetoothGattCallback
中实现onCharacteristicWrite
。 - EmilonCharacteristicWrite
是从 Binder 线程调用的,这通常不是您发起操作的线程。因此,txQueue 可能会被两个线程同时使用。该代码还存在一个问题,如果您连接到不同的蓝牙地址,则会泄漏先前的 BluetoothGatt 对象(作者忘记了它必须关闭)。 - Emil