我正在尝试编写 BLE Android 应用程序。我发现有时当我打电话时BluetoothGatt.writeDescriptor() https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html#writeDescriptor(android.bluetooth.BluetoothGattDescriptor)它返回 false。
我在文档中没有发现任何对此功能的限制说明。但是堆栈溢出上的 ppl 说我需要等待BluetoothGattCallback.onDescriptorWrite() https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html#onDescriptorWrite(android.bluetooth.BluetoothGatt,%20android.bluetooth.BluetoothGattDescriptor,%20int)在我尝试编写另一个描述符之前。
这是一篇回复说BLE 正忙 https://stackoverflow.com/a/36169096/1093607与 writeDescriptor() 一起使用,不能进行其他写入。
Here is 另一个线程 https://stackoverflow.com/a/24178815/1093607也就是说你不能调用两次 writeCharacteristic()。
我的问题是
- 这是真的吗?
- 是否真的缺少一些用于序列化 BLE 请求的内部 Android API 缓冲区,并且每个开发人员都必须自己完成?
- 对于不同的功能也是如此吗?例如当我打电话时
writeDescriptor()
我明白我不能再打电话writeDescriptor()
在我收到之前onDescriptorWrite()
。但我必须等待onDescriptorWrite()
当我想打电话时writeCharacteristic()
?
- 另外,如果存在函数间依赖性,那么还有什么函数有此限制(即:
readCharacteristic()
, readDescriptor()
, requestMtu()
...)?
- 此外,BluetoothGattServer 和BluetoothGatt 之间还存在相互依赖性。例如当我打电话时
BluetoothGattServer.notifyCharacteristicChanged()
我应该等待吗BluetoothGattServerCallback.onNotificationSent https://developer.android.com/reference/android/bluetooth/BluetoothGattServerCallback.html#onNotificationSent(android.bluetooth.BluetoothDevice,%20int)在我打电话之前BluetoothGatt.writeDescriptor()
or BluetoothGatt.writeCharacteristic()
? (顺便说一句,对谷歌文档的赞扬onNotificationSent()
幸运的是,它被正确记录。医生说:
当要发送多个通知时,应用程序必须等待
在发送附加信息之前收到此回调
通知。
- 最后有所有这些问题 - 我觉得 Android BLE API 的记录不足。或者我错了,在某处记录了允许调用序列的方法是什么?如果是的话,您能给我指出这样的文档吗?如果没有,是否有一些渠道我们可以向谷歌提出问题并要求他们在文档中添加一些内容?我的意思是它可能没有太多文字 - 有些功能如
onNotificationSent()
已经正确记录。他们只需要将这句话复制到其他函数中即可。
该文档缺乏信息。不过,您可以阅读源代码来找出规则,(目前)如下:
对于每个BluetoothGatt
对象,一次只能有一个未完成的请求,包括requestMtu
, readCharacteristic
, writeCharacteristic
, readDescriptor
, writeDescriptor
and executeReliableWrite
。因此,如果您发出读取请求,则需要等待读取响应,然后才能发出写入请求。虽然他们实现了如果有正在进行的操作则返回 false 的代码蓝牙Gatt.java https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothGatt.java,他们忘记这样做了requestMtu
,所以如果您同时有多个请求requestMtu
是其中之一,您迟早会遇到随机错误(在本文发布时的最新版本中)。
所以是的,每个开发人员都必须手动序列化请求。请注意,蓝牙堆栈实际上有一个请求队列,但每个客户端仅限一个请求(即BluetoothGatt 对象)。因此,如果同一部手机上的两个应用程序同时与同一设备通信,您将永远不会收到“忙”错误。唯一的例外是,如果您使用 Write Without Response,则当前数据流实现存在很大的错误(请参阅https://issuetracker.google.com/issues/37121017 https://issuetracker.google.com/issues/37121017谷歌似乎忽略了这一点)。
您可以在编写特征的同时发送通知,因为服务器和客户端角色是分开的。
关于更新文档,您可以随时尝试在以下地址提交问题:https://issuetracker.google.com https://issuetracker.google.com(但我感觉没有人读到),或者,由于 Android 是开源的,请将拉取请求发送到https://android-review.googlesource.com/ https://android-review.googlesource.com/它更新生成文档的 Javadoc。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)