如何为所有连接的设备同时执行 BluetoothGatt 读写请求?

Posted

技术标签:

【中文标题】如何为所有连接的设备同时执行 BluetoothGatt 读写请求?【英文标题】:How to execute the BluetoothGatt read and write requests same time for all connected devices? 【发布时间】:2016-04-20 12:22:00 【问题描述】:

我想连接多个BLE设备并行读写操作?

【问题讨论】:

【参考方案1】:

我们在 android 上使用 BLE 的经验清楚地表明,Android BLE 堆栈上的多线程操作可能会导致许多问题.. ;)

我建议你一次只做一件事,并尽量避免并行工作......

我们的 2 美分...

【讨论】:

感谢您的回答:) @p2pkit “我建议你一次只做一件事,并尽量避免并行工作......” - 你会在每个连接的基础上推荐这个,还是在所有被维护的连接上推荐这个通过应用程序(如果我同时连接到多个设备)?即这个问题:***.com/questions/28016571/… 我建议在所有连接中只做一件事,如果可能的话只打开一个连接。根据我们的经验,并行连接会导致很多问题。【参考方案2】:

为了能够同时连接到多个设备,您必须使用自动连接 gatt 功能,而不是直接连接 (http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context,%20boolean,%20android.bluetooth.BluetoothGattCallback))。

如果您使用自动连接,手机可以同时发起多个连接。如果使用直接连接,则只能同时发起一个连接。

然而,一旦连接上,您就可以并行执行所有 gatt 操作,尽管每个外围设备一次只能有一个未完成的 gatt 操作。

【讨论】:

这部分是正确的。自动连接标志不影响并行连接。您也可以在直接模式下执行它们。我们在库开发 (RxAndroidBLE) 期间对其进行了测试。您应该知道您应该在连接中对调用进行排队,但是库会为您完成。 你是什么意思?如果您使用直接连接而不是自动连接,它一次只会尝试连接到一台设备。至少对于 Nexus 设备上的标准 Android 而言。只需查看 hci snooplog。 我的意思是你可以使用一个队列,在直接模式下一个接一个地连接。直接连接初始化速度要快得多。【参考方案3】:

有几个库可以让您轻松地做到这一点。

例如,RXAndroidBLE 是一项很棒的工作。但如果你使用 Kotlin - 有更简单的方法:BleGattCoroutines。

基本上,它使用 Kotlin 的协程将异步(和丑陋的)Android BLE API 包装到普通同步风格的调用中。

免责声明:我不使用这个库本身,但在我最近的商业嵌入式项目中使用相同的方法。它就像一个魅力。

【讨论】:

【参考方案4】:

This is one 我发现的更好的存储库,用于在 Android 中使用 BLE 堆栈。但它没有提供操作的并行处理。我认为,如果您在 SDK 级别工作,则确实无法进行并行操作,因为您没有任何低级控制。

有一个新的 RXAndroidBLE 库,我没用过,但它可能会有所帮助。有一些讨论about it here。他们显然能够同时连接 5 个传感器并处理数据……尽管它仍然是连续的。

【讨论】:

感谢@ninerdelta 我会根据 RXAndroid Ble 库进行检查 FWIW,我有一个可以连接到 5 个 BLE 设备的应用程序,它使用与第一个链接非常相​​似的方法。基本思想只是设置一个队列来处理传入的回调。当然这是非常高级的总结!

以上是关于如何为所有连接的设备同时执行 BluetoothGatt 读写请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Android 应用强制执行最低蓝牙 MTU?

如何为所有 IPAD 设备加载特定的字体

如何为所有设备制作响应式网站[关闭]

Android-如何为所有手机设备或大多数手机开发应用程序概念和技术

如何为拥有多个设备的用户管理 APN 令牌?

如何为所有 iphone 设备在同一行中设置多个 UIlabel