我有一辆蓝牙LE遥控车。因此,我需要定期对汽车上的drive特征进行写入。我的微控制器(AtmelXMega128A1 @32 My + nRF8001)应该能够处理每秒高达122个连接,连接间隔为7.5ms。
我的安卓应用基于科尔多瓦和一个蓝牙低能耗插件:https://github.com/randdusing/BluetoothLE
我在安装了Android v4.4.4的Nexus5上运行这个程序。
我有一个计时器,它每175ms向汽车发送转向和加速度的值。我想发送每50毫秒,但这不工作。我不知道问题出在哪里,但我猜是GATT的android实现(我在某种程度上得到了挂起的命令错误)。
如果我写的东西超过了它的处理能力,那么car就会连续执行所有的命令,但是时移了。一些队列显然出现了问题,这不是微控制器,因为它的运行速度要快得多。
我正在做一个似乎很成功的时间改变。我试着关闭WiFi,因为我希望它能有所帮助,但什么都没有改变。
有没有在Android平台上写GATT特色期刊经验?举个例子就好了。
发布于 2014-08-24 22:08:25
首先,你应该做一个健壮的设计。数据应该由Android BT Stack的回调驱动,告诉它什么时候准备好接受更多的数据(当上一次传输完成时)。不要使用计时器。总是需要在较低的堆栈级别上进行重新传输,因此您不能依赖准确的传输间隔和吞吐量。
7.5ms是最短的连接间隔,但是默认的连接间隔通常要慢得多(在我的Nexus5和Android L上是48.75ms),所以一旦连接上,你应该尝试从你的外设请求一个更快的连接间隔。这将加快您的吞吐量和响应速度。
如果你试图强制一个非常快的连接间隔,一些Android BT堆栈会拒绝。你应该聪明地处理这件事。比如尝试7.5ms (参数= 6),如果失败就增加它。iOS设计指南指出,您不能使用小于20 (*1.25ms)的值,并且最高请求值应至少比最低请求值高20。不过,如果您请求的值为min=10、max=20和end约为18ms或其他值,您将获得一个更快的连接参数。对于android,似乎大多数人会接受7.5ms (值6),但同样,你不应该强制它,因为堆栈可能会取消连接。
我在Android L上做了实验,在连接时请求外围设备的连接间隔。Android对请求进行了四舍五入,所以只有第三步才会有所不同。6=7.5ms、9=11.25ms、12=15.0ms、...、39=48.75ms,这似乎是运行Android L的Nexus5的默认值。
蓝牙是broadcom芯片组中的一种共享资源,大多数都在智能手机端使用。Wifi,BT Classic,BT Low Enegy,有时还有GPS共享带宽。你会看到打呃,必须对它们保持容忍。做一个健壮的设计。
如果您需要比默认大小更大的数据包,可以尝试重新协商MTU大小。根据规范,这是一个可选的BLE功能,但是苹果在iOS7中完全打破了它,他们使用它作为一个强制性的东西来提高吞吐量。这破坏了所有没有实现响应处理器的BLE设备,因此它崩溃了,并且在进行软件更新之前永远不能与iOS设备一起使用。哇哇。不过,对于android来说,这不是问题。
https://stackoverflow.com/questions/25460066
复制相似问题