Android BLE 回调 OnWriteCallback 几秒钟后停止

Posted

技术标签:

【中文标题】Android BLE 回调 OnWriteCallback 几秒钟后停止【英文标题】:Android BLE callback OnWriteCallback stops after few seconds 【发布时间】:2017-05-17 22:01:19 【问题描述】:

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

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

每个连接间隔发送多个数据包的确切含义是什么(有什么方法可以通过外围设备实现)?

【问题讨论】:

你有什么安卓设备/操作系统版本? android 4.4.2 kitkat @Emil 我的 BLE 版本也是 4.2。但我不知道如何在每个 conn 间隔发送多个数据包。我根据每个数据包收到 onCharacteristicWrite 回调的时间一​​个一个发送数据包。但是在一段时间后(在大约 300 个数据包的 onCharacteristicWrite 回调状态为 0 成功之后),回调突然停止并且即使在数据包重新发送时也不会被触发。因此,我在两个数据包之间添加了 8 毫秒的延迟,它成功写入了所有数据包,回调状态为 0,但这实际上降低了吞吐量。有没有更好的方法来实现这个? @Emil Android 4.4.2 kitkat @Emil 我的 Gatt WriteCharacteristic 函数在我发送任何数据包时返回布尔值 true。这个返回true和每个包发送后OnWriteCharacteristic Callback status -0success有什么区别?? 【参考方案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 回调将发送 status=0。

我最近写了一篇关于此的帖子,您可以在这里阅读:onCharacteristicWrite and onNotificationSent are being called too fast - how to acquire real outgoing data rates?。

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

【讨论】:

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

以上是关于Android BLE 回调 OnWriteCallback 几秒钟后停止的主要内容,如果未能解决你的问题,请参考以下文章

Android 8.1 连接到调用 connectGatt 的 BLE 外围设备。回调总是说断开连接。从不连接

Android ble蓝牙使用注意

BLE 扫描回调的类加载期间的 NoClassDefFoundError

Android ble 设备有时不会断开连接

如果在 Android 中连接到 BLE 设备失败,如何通知用户?

Android BLE低功耗蓝牙开发极简系列(二)之读写操作