Android 低功耗蓝牙顺序写入性能

标签 android bluetooth-lowenergy

我有一辆蓝牙 LE 遥控车。因此,我需要定期写入汽车上的 drive 特性。我的微 Controller (AtmelXMega128A1 @ 32Mhz + nRF8001) 应该能够在 7.5ms 连接间隔下每秒处理多达 122 个连接。

我的 Android 应用程序基于 cordova 和蓝牙低功耗插件:https://github.com/randdusing/BluetoothLE

我在装有 Android v4.4.4 的 Nexus 5 上运行它。

我有一个计时器,它每 175 毫秒向汽车发送一次转向和加速值。我想每 50 毫秒发送一次,但这不起作用。我不知道问题出在哪里,但我猜这是 GATT 的 android 实现(我在某种程度上得到了挂起的命令错误)。

如果我写的超过它可以处理的汽车连续执行所有命令但时间偏移。显然有些队列问题,这不是微 Controller ,因为它运行得更快。

我正在做一个似乎成功的时间更改。我尝试关闭 WiFi,希望它能有所帮助,但没有任何改变。

有没有关于Android上GATT特性的期刊文章的经验?例子会很棒。

最佳答案

首先,您应该进行稳健的设计。数据应由来自 Android BT 堆栈的回调驱动,告诉它何时准备好接受更多数据(上一次传输完成时)。不要使用定时器。在较低的堆栈级别总是需要重新传输,因此您不能依赖确切的传输间隔和吞吐量。

7.5 毫秒是可能的最短连接间隔,但默认值通常要慢得多(在我的配备 Android L 的 Nexus 5 上为 48.75 毫秒)因此,您应该在连接后尝试从您的外围设备请求更快的连接间隔。这将加快您的吞吐量和响应速度。

如果您尝试强制非常快的连接间隔,一些 Android BT 堆栈会拒绝。你应该聪明地处理它。就像尝试使用 7.5ms(参数 = 6)并在失败时增加它一样。 iOS 设计指南规定您不得使用低于 20 (*1.25ms) 的值,上限请求值应至少比下限高 20。如果您请求值 min=10、max=20 并在 18 毫秒左右结束,您将获得更快的连接参数。 对于 android 来说,它似乎大多数会接受 7.5ms(值 6),但同样你不应该强制它,因为堆栈可能会取消连接。

我在Android L上做了实验,连接时向外设端请求连接间隔。 Android 对请求进行了四舍五入,因此只有每 3 步才会有所不同。 6=7.5ms, 9=11.25ms, 12=15.0ms, ..., 39=48.75ms 这似乎是运行 Android L 的 Nexus 5 上的默认值。

蓝牙是大多数在智能手机端使用的博通芯片组中的共享资源。 Wifi、BT Classic、BT Low Enegy 和有时 GPS 共享带宽。你会看到打嗝,必须对它们宽容。进行稳健的设计。

如果您需要比默认值更大的数据包,您还可以尝试重新协商 MTU-SIZE。根据规范,这是一个可选的 BLE 功能,但 Apple 在 iOS7 中完全打破了它,他们将其用作提高吞吐量的强制性功能。这破坏了所有未实现响应处理程序的 BLE 设备,因此它崩溃了,并且在进行 SW 更新之前永远无法与 iOS 设备一起使用。呸呸呸。不过对于安卓来说这不是问题。

关于Android 低功耗蓝牙顺序写入性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25460066/

相关文章:

android - Travis CI 仍然无法通过 Espresso 测试 - Android

ios - 如何以 iOS 端为中心控制扫描请求?

ios - 如何在 Objective-C 中使用 startMonitoringForRegion 扫描多个区域

java - 单击按钮更改图像

java - AppCompat 不支持当前主题

android - Wifi 连接时保持 3G 连接在线(自定义 Android 系统)

c# - 如何配置 WPF 项目以使用 BLE?

IntelliJ IDEA中Android开发导调用脑死机

ios - 如何在 iOS 中将数据发送到蓝牙 LE

ios - CoreBluetooth - 在 iPhone 上实现的外围设备的通用访问(1800)?