0

我正在尝试根据 OnCharacteristicWrite 回调条件同步写入下一个数据包以实现最大吞吐量。但由于某种原因,它会在 1-2 秒后的初始阶段停止触发 OnCharacteristicWrite 回调,即使我重新发送数据包,它也不会被调用。如果我添加每个数据包的延迟效果很好,但我不想添加任何延迟来实现最大吞吐量。

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

另外,每个连接间隔发送多个数据包到底意味着什么(有什么方法可以通过外围设备实现)?

4

1 回答 1

1

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

不幸的是,当您使用“Write without Response”发送多个数据包时,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 和 onNotificationSent 调用速度太快 - 如何获取真正的传出数据速率?.

如果您想为 KitKat 提供一个简单的解决方法,您可以将 10 个数据包写入无响应写入,然后将第 11 个数据包写入有响应,然后从无响应写入重新开始。那应该会给你不错的表现。

于 2017-05-18T12:42:30.137 回答