我正在尝试编写ble安卓应用程序。我发现有时候我打电话
BluetoothGatt.writeDescriptor()返回false。
我在文档中没有发现任何关于此功能限制的注释。但ppl on stack overflow表示,在尝试编写另一个描述符之前,我需要等待BluetoothGattCallback.onDescriptorWrite()
这里有一个回复说,BLE is busy使用writeDescriptor()无法执行其他写入操作。
这里是another thread表示不能调用两次writeCharacteristic()。
我的问题是
是真的吗?
是否真的缺少一些内部的android api缓冲区来序列化可序列化的请求,每个开发人员都必须自己完成?
对于不同的功能是真的吗?例如,当我打电话给writeDescriptor()时,我明白在收到writeDescriptor()之前我不能再打第二次。但是,当我想打电话给onDescriptorWrite()时,是否必须等待onDescriptorWrite()
另外,如果存在函数间依赖关系,那么还有什么函数具有此限制(即:writeCharacteristic()readCharacteristic()readDescriptor()…)?
此外,BluetoothGattServer和BluetoothGatt之间存在相互依赖关系。例如,当我调用requestMtu()时,我应该等待BluetoothGattServer.notifyCharacteristicChanged()之后才能调用BluetoothGattServerCallback.onNotificationSentBluetoothGatt.writeDescriptor()?(顺便说一句,对google documentationBluetoothGatt.writeCharacteristic()的赞扬是幸运的,它被正确地记录了下来。医生说:
当要发送多个通知时,应用程序必须等待
在发送附加的
通知。
最后有这些问题-我觉得android ble api文档不足。或者我错了,并且在某个地方记录了什么是允许的方法调用序列?如果有的话,你能给我指一下这些文件吗?如果没有,我们是否可以通过一些渠道向谷歌提出问题,并要求他们在文档中添加一些内容?我的意思是它可能不是太多的文本-像onNotificationSent()这样的一些函数已经被正确地记录下来了。他们只需要把这个句子复制到其他函数中。

最佳答案

文件缺乏信息。但是,您可以阅读源代码以了解规则,这些规则(当前)如下:
对于每个BluetoothGatt对象,一次只能有一个未完成的请求,包括requestMtureadCharacteristicwriteCharacteristicreadDescriptorwriteDescriptorexecuteReliableWriterequestMtu。因此,如果发出读请求,则需要在发出写请求之前等待读响应。当他们实现了如果BluetoothGatt.java中有一个正在进行的操作返回false的代码时,他们忘记为requestMtu执行此操作,因此如果您在是其中之一的时间有多个请求,您迟早会得到随机错误(在本文发表时的最新版本中)。
所以是的,每个开发人员都必须手动序列化请求。请注意,蓝牙堆栈实际上有一个请求队列,但它仅限于每个客户端一个请求(即BluetoothGatt对象)。因此,如果同一部手机上的两个应用同时与同一台设备通话,则永远不会出现“忙”错误。唯一的例外是,如果您使用write而不响应,那么当前的数据流实现是非常错误的(请参见https://issuetracker.google.com/issues/37121017google似乎忽略了这一点)。
您可以在编写特征的同时发送通知,因为服务器和客户端角色是分开的。
关于更新文档,您可以尝试在https://issuetracker.google.com处提交问题(但我感觉没有人阅读),或者,由于android是开源的,向https://android-review.googlesource.com/发送一个pull请求,该请求更新生成文档的javadoc。

08-26 02:59