0

我试图根据OnCharacteristicWrite回调条件同步写入下一个数据包以实现最大吞吐量。但由于某种原因,它会在1-2秒的时间后在非常初始时停止触发OnCharacteristicWrite回调,即使我重新发送数据包,它也永远不会被调用。如果我为每个数据包添加延迟,但是我不想添加任何延迟来实现最大吞吐量,那么它工作得很好。Android BLE回调OnWriteCallback在几秒后停止

有什么办法可以在不增加任何延迟的情况下实现最大吞吐量?

另外,每个连接间隔究竟发送多个数据包意味着什么(以及是否有任何方法可以通过外设实现)?

+0

你有什么Android设备/操作系统版本? – Emil

+0

Android 4.4.2 kitkat –

+0

@Emil我的BLE版本是4.2。但我没有得到如何发送每conn间隔多个数据包。根据每个数据包收到onCharacteristicWrite回调的时间,我正在逐个发送数据包。但是经过一段时间(约300个onCharacteristicWrite回调状态0成功的数据包之后),回调突然停止,即使在数据包重发时也不会触发。所以我在两个数据包之间添加了一个8ms的延迟,它将所有数据包成功写入回调状态为0,但这实际上降低了吞吐量。有没有更好的方法来实现这一点? –

回答

1

如果您使用Write Without Response(请参阅https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html#setWriteType(int)),您将能够每个连接间隔发送多个数据包。

Android KitKat不幸的是,当你用“无响应写入”发送多个数据包时,流量控制失效。如果您尝试使用较新的Android设备,它应该可以正常工作。

如果writeCharacteristic方法返回true,则表示它已将您的数据包传递给蓝牙进程。您可以在https://android.googlesource.com/platform/frameworks/base/+/fe2bf16a2b287c3c748cd6fa7c14026becfe83ff/core/java/android/bluetooth/BluetoothGatt.java#1081的源代码中查看确切的逻辑。基本上,如果特征具有写属性,则gatt对象有效,并且当前没有其他未决的GATT操作正在进行,则返回true。

当写入响应到达(用于写入响应)或蓝牙堆栈就绪并且有缓冲区空间来接受新数据包(用于无响应写入)时,onCharacteristicWrite回调将发送状态= 0。

我最近在这里写了一篇文章,您可以阅读:onCharacteristicWrite and onNotificationSent are being called too fast - how to acquire real outgoing data rates?

如果您想为KitKat提供简单的解决方法,您可以将10个数据包写为Write Without Response,然后将第11个数据包写为Response With,然后从Write Without Responses开始。这应该给你体面的表现。

+0

感谢您的详细信息。我能够在短时间内写入没有响应的数据包,但要检查数据完整性,我会循环备份BLE的Tx和Rx引脚,并检查OnCharacteristicChange回调并读取相同特性后是否收到相同的数据。我根据这个数据比较发送下一个数据包。但是基于具有相同特性的OnCharacteristicChanges读取数据包似乎是非常缓慢的过程。我还可以使用两种不同的特性用于写/发送和其他读取和如何?谢谢! –