我的问题是:Android 4.3(客户端)可以与多个 BLE 设备(服务器)建立活动连接吗?如果是这样,我怎样才能实现它?
到目前为止我做了什么
我尝试评估使用 BLE 和 Android 4.3 BLE API 可以实现的吞吐量。此外,我还尝试找出可以同时连接和激活多少设备。我使用 Nexus 7 (2013)、Android 4.4 作为主设备,使用 TI CC2540 Keyfob 作为从设备。
我为从站编写了一个简单的服务器软件,它通过 BLE 通知传输 10000 个 20Byte 数据包。我的 Android 应用程序基于应用加速器来自蓝牙 SIG。
它适用于一台设备,我可以在 7.5 毫秒的连接间隔下实现大约 56 kBits 的有效负载吞吐量。为了连接到多个奴隶,我遵循了一位北欧员工的建议,他在北欧开发区:
是的,可以使用单个应用程序处理多个从站。您需要使用一个 BluetoothGatt 实例来处理每个从属设备。您还需要为您连接的每个从站指定特定的BluetoothGattCallback。
所以我尝试了一下,部分有效。我可以连接到多个从站。我还可以注册多个从站的通知。当我开始测试时问题就开始了。我首先收到来自所有从站的通知,但在几个连接间隔之后,只有来自一个设备的通知出现。大约 10 秒后,其他从站断开连接,因为它们似乎达到了连接超时。有时,我从测试一开始就只收到来自一个从属设备的通知。
我还尝试通过读取操作访问该属性,得到相同的结果。经过几次阅读后,只有一台设备给出了答案。
据我所知,这个论坛上也有一些类似的问题:Android 4.3 支持多个 BLE 设备连接吗?, 原生 Android BLE GATT 实现具有同步性质吗? or BLE 多重连接。但这些答案都没有让我清楚,是否可能以及如何做到。
我将非常感谢您的建议。
我怀疑每个人添加延迟只是为了让 BLE 系统在您提交另一项操作之前完成您所要求的操作。 Android 的 BLE 系统没有任何形式的队列。如果你这样做
BluetoothGatt g;
g.writeDescriptor(a);
g.writeDescriptor(b);
那么第一个写操作将立即被第二个写操作覆盖。是的,这确实很愚蠢,文档可能应该提到这一点。
如果插入等待,它允许第一个操作在执行第二个操作之前完成。但这是一个巨大而丑陋的黑客行为。更好的解决方案是实现自己的队列(就像 Google 应该有的那样)。幸运的是 Nordic 为我们发布了一款。
https://github.com/NordicSemiconductor/puck-central-android/tree/master/PuckCentral/app/src/main/java/no/nordicsemi/puckcentral/bluetooth/gatt
编辑:顺便说一下,这是 BLE API 的普遍行为。 WebBluetooth 的行为方式相同(但 Javascript 确实使其更易于使用),而且我相信 iOS 的 BLE API 的行为方式也相同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)