在Android上同时与多个BLE设备进行稳健通信

时间:2015-01-19 00:56:52

标签: android bluetooth-lowenergy android-bluetooth

虽然没有记载,但使用Android BLE apis的传统智慧是某些操作,如读/写特征&描述符应该一次完成一个(尽管有些设备比其他设备更宽松)。但是,我不清楚此策略是仅应用于单个连接还是应用于所有活动连接。

我听说最好一次启动与设备的连接。这可能是应该在所有设备之间串行执行的操作(connect / connectGatt)的一个例子。

但是对于其他操作,比如读写特性,如果每个连接串行执行操作,或者我是否需要在所有设备之间共享一些全局操作队列,以便在所有设备之间只执行一个操作,那么它是否足够好? / p>

3 个答案:

答案 0 :(得分:6)

在Android上,每个BluetoothGatt对象你应该一次只执行一个操作(请求mtu,发现服务,读/写特性/描述符)否则会出错。您必须等到相应的回调被调用,直到您可以执行下一个操作。

关于同时与多个设备建立挂起连接,如果使用autoConnect = true则没有问题但是如果使用autoConnect = false则Android的蓝牙堆栈将仅尝试连接到一个设备一个时间,这意味着如果有多个未完成的,它会将连接请求排入队列。有一个特殊的错误,它无法取消仍在队列中的挂起连接(当你调用.disconnect()或.close()时),但最近在Android中修复了这个错误。

请注意,还有最大数量的连接/挂起连接/ gatt对象,当您超出这些限制时,行为完全没有记录。在最好的情况下,你只是得到一个错误状态的回调,但在某些情况下,我已经看到android蓝牙堆栈卡在无限循环中,在每次迭代中它都告诉蓝牙控制器连接到设备但控制器发回错误代码达到的最大连接数。

答案 1 :(得分:2)

虽然我不能代表上层,但我可以了解在较低硬件级别会发生什么,这可能会为您的设计提供一些见解。

上层的堆栈正在进行,最后操作必须由收发器芯片处理。

BLE运行超过40个频道,其中3个用于广播,其他用于数据传输。这样做是为了能够使多个设备一起通信,通过在其他频带上限制冲突。

根据噪音最低(或流量)的频段选择这些频段。

收发器本身一次只能在一个频段进行通信(说话和收听),并且必须在频段之间切换以到达其他设备。这是通过非常紧凑的通信时间来完成的。

另一个事实是,无线收发器基本上是某种带有冲突检测的半双工通信,它不能同时发送和监听,也不能同时在同一频段上发送两个设备。因此,它的设计(和自然法则)是连续的或顺序的。

如果你实现某种操作队列或线程实现,最后一切都必须由收发器串行/顺序处理。

如果您通过不同的线程访问它,收发器可能必须在通道之间一直跳转,或者如果在上层没有很好地处理它可能会感到困惑。

我可能会在线程上看到的唯一理由是收发器的处理时间明显低于您必须运行的上层堆栈,并且您将利用多核处理器。

但除非非常具体的软件需要或架构,否则我不相信你会有一个不同的实现而不是串行的重大收益,我也会一个接一个地与奴隶说话而不是同时考虑所有如上所述。

答案 2 :(得分:-1)

BLE旨在实现异步和事件驱动。您可以随意发送命令,然后您将无需特定顺序获得响应。如果您发送命令并希望下一个数据包成为响应,那么您将陷入麻烦。

话虽这么说,我不确定Android库是如何构建的。