我有蓝牙LE遥控车。因此,我需要定期写入汽车的drive
特征。我的微控制器(AtmelXMega128A1 @ 32Mhz + nRF8001)应该能够在7,5ms的连接间隔内每秒处理多达122个连接。
我的Android应用程序基于cordova和蓝牙低能量插件:https://github.com/randdusing/BluetoothLE
我在使用Android v4.4.4的Nexus 5上运行此功能。
我有一个计时器,每隔175ms就会向车辆发送转向和加速度值。我想发送每个50毫秒,但这不起作用。我不知道问题在哪里,但我猜它是GATT的android实现(我在某种程度上得到了挂起的命令错误)。
如果我写的数量超过它可以处理的数量,那么汽车会连续执行所有命令,但时间会发生变化。有些队列很明显,这不是微控制器,因为它的运行速度要快得多。
我正在做一个似乎成功的时间变化。我尝试关闭WiFi,因为我希望它会有所帮助,但没有任何改变。
在Android上有关于GATT特征的期刊着作的经验吗?例子很棒。
答案 0 :(得分:1)
首先,你应该做一个健壮的设计。数据应该由来自Android BT Stack的回调驱动,告诉它什么时候准备接受更多数据(当前一次传输完成时)。不要使用计时器。在较低的堆栈级别上总是需要重传,因此您不能依赖于精确的传输间隔和吞吐量。
7.5毫秒是最短的连接间隔,但是默认值通常要慢得多(我的Nexus 5搭载Android L的时间为48.75毫秒)因此,从外围设备开始连接后,您应尝试请求更快的连接间隔。这将加快您的吞吐量和响应速度。
如果您尝试强制连接间隔非常快,某些Android BT堆栈会拒绝。你应该聪明地处理它。就像尝试使用7.5ms(参数= 6)并在失败时增加它一样。 iOS设计指南规定,您不得使用低于20(* 1.25ms)的值,并且上限请求值应至少比下限值高20。如果您请求值min = 10,max = 20并以18ms左右结束,您将获得更快的连接参数。 对于Android来说,似乎大多数人会接受7.5毫秒(值6),但你不应该再强迫它,因为堆栈可能会取消连接。
我在Android L上进行了实验,在连接时请求外围设备的连接间隔。 Android取消了请求,因此只有每一步都有所不同。 6 = 7.5ms,9 = 11.25ms,12 = 15.0ms,...,39 = 48.75ms,这似乎是运行Android L的Nexus 5的默认值。
蓝牙是大多数智能手机方面使用的broadcom芯片组的共享资源。 Wifi,BT Classic,BT Low Enegy以及GPS共享带宽。你会看到打嗝,必须容忍他们。做一个稳健的设计。
如果您需要比默认数据包更大的数据包,您可以尝试的其他方法是重新协商MTU-SIZE。这是规格可选的BLE功能,但Apple在iOS7中完全破解了它,它们将其作为强制性产品来提高吞吐量。这打破了所有没有实现响应处理程序的BLE设备,因此它崩溃了,在完成软件更新之前永远不能与iOS设备一起使用。 Baaaaaad。对于android来说,这不是问题。