我正在尝试根据OnCharacteristicWrite回调条件同步写下一个数据包,以实现最大吞吐量。但由于某种原因,它会在1-2秒的周期后停止触发OnCharacteristicWrite回调,并且即使重新发送数据包也不会被调用。如果我添加每个数据包的延迟但它不想添加任何延迟以实现最大吞吐量,它的效果很好。
有没有什么方法可以在不增加任何延迟的情况下实现最大吞吐量?
另外,每个连接间隔确切地发送多个数据包意味着什么(有没有办法通过外设实现它?)
答案 0 :(得分:1)
如果您使用Write Without Response(请参阅https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html#setWriteType(int)),您将能够在每个连接间隔发送多个数据包。
Android KitKat在发送多个数据包时发生了错误的流量控制,其中包括" Write Without Response"。如果您尝试使用较新的Android设备,它应该可以正常使用。
如果writeCharacteristic方法返回true,则表示它已将您的数据包传递给蓝牙进程。您可以在https://android.googlesource.com/platform/frameworks/base/+/fe2bf16a2b287c3c748cd6fa7c14026becfe83ff/core/java/android/bluetooth/BluetoothGatt.java#1081处看到源代码中的确切逻辑。基本上,如果特性具有write属性,则gatt对象有效并且当前没有其他待处理的GATT操作继续,则返回true。
onCharacteristicWrite回调将在写入响应到达时发送status = 0(对于Write With Response)或蓝牙堆栈已准备好且具有缓冲区空间以接受新数据包(对于无响应写入)。
我最近写了一篇关于你的文章,你可以阅读:onCharacteristicWrite and onNotificationSent are being called too fast - how to acquire real outgoing data rates?。
如果你想要一个简单的KitKat解决方法,你可以写10个数据包作为Write Without Response,然后将第11个数据包写为Write With Response,然后从Write Without Responses开始。这应该会给你不错的表现。