Android BLE BluetoothGatt.writeDescriptor()有时会返回false

Vit*_*tik 5 android bluetooth-lowenergy

我正在尝试编写BLE Android应用程序.我发现有时当我调用 BluetoothGatt.writeDescriptor()时它会返回false.

我没有在文档中找到任何关于此功能的限制说明.但是堆栈溢出的ppl说我需要等待BluetoothGattCallback.onDescriptorWrite()才能尝试编写另一个描述符.

这是一个回复说BLE忙于 writeDescriptor()而不能做其他写操作.

这是另一个线程说你不能再调用writeCharacteristic()两次.

我的问题是

  • 这是真的吗?
  • 是否真的缺少一些用于序列化BLE请求的内部android API缓冲区,每个开发人员都必须自己动手做?
  • 对于不同的功能是否属实?例如,当我打电话时,writeDescriptor()我知道writeDescriptor()在收到之前我不能第二次打电话onDescriptorWrite().但是,onDescriptorWrite()当我想打电话时,我必须等待writeCharacteristic()吗?
  • 此外,如果有功能间依赖性然后还有什么功能都有此限制(即:readCharacteristic(),readDescriptor(),requestMtu()...)?
  • 此外,BluetoothGattServer和BluetoothGatt之间存在相互依赖关系.所以,例如,当我打电话给BluetoothGattServer.notifyCharacteristicChanged()我时,我等待BluetoothGattServerCallback.onNotificationSent才能打电话BluetoothGatt.writeDescriptor()BluetoothGatt.writeCharacteristic()?(BTW对谷歌文档的称赞onNotificationSent()是通过运气记录得当.Doc说:

当要发送多个通知时,应用程序必须等待收到此回调才能发送其他通知.

  • 最后提出所有这些问题 - 我觉得Android BLE API文档不足.或者我错了,并且在某处记录了允许调用序列的方法?如果是,请指点我这样的文件?如果不是有一些渠道,我们可以打开谷歌的问题,并要求他们添加到文档的东西?我的意思是它可能不是很多文本 - 某些功能就像onNotificationSent()arleady正确记录的那样.他们只需要将这句话复制到其他功能.

Emi*_*mil 11

文档缺乏信息.但是,您可以阅读源代码以找出规则,其中(当前)如下:

对于每一个BluetoothGatt对象,你只能有一次一个未完成的请求,其中包括requestMtu,readCharacteristic,writeCharacteristic,readDescriptor,writeDescriptorexecuteReliableWrite.因此,如果发出读取请求,则需要在发出写入请求之前等待读取响应.虽然他们实现返回错误代码,如果有在正在进行的操作BluetoothGatt.java,他们忘了为做到这一点requestMtu,所以如果你有在同一时间多个请求,其中requestMtu就是其中之一,你会得到随机误差迟早(在这篇文章的最新版本).

所以,是的,每个开发人员都必须手动序列化请求.请注意,蓝牙堆栈实际上有一个请求队列,但它仅限于每个客户端只有一个请求(即BluetoothGatt对象).因此,如果同一电话上的两个应用同时与同一设备通话,您将永远不会出现"忙碌"错误.唯一的例外是,如果您使用Write Without Response,当前的数据流实现非常错误(请参阅https://issuetracker.google.com/issues/37121017,Google似乎忽略了这一点).

您可以在编写特征的同时发送通知,因为服务器和客户端角色是分开的.

关于更新文档,您总是可以尝试在https://issuetracker.google.com上提交问题(但我觉得没有人读到这个),或者,因为Android是开源的,所以向https发送拉取请求:/ /android-review.googlesource.com/更新生成文档的Javadoc.