使用BlueZ同时建立多个BLE连接

5

我有一个Linux C应用程序需要与多个BLE设备建立连接。该应用程序使用从gatttool中削减的库。由于BLE设备的广告速率非常慢,因此需要很长时间才能建立连接。因此,我需要能够同时进行多个gatt_connect请求。

gatt_connect使用标准的socket/connect来建立与设备的L2CAP连接。虽然这种方法允许您拥有多个活动连接,但它只允许您同时建立一个连接。使用HCI接口,您可以同时建立多个接口(即hcitool lecc --whitelist),但我无法找到一种方法将其与gatttool库的L2CAP socket/connect集成。

是否有人可以建议一种方法将gatttool L2CAP socket/connect与“hcitool lecc --whitelist”使用的hci_open_dev/hci_le_create_conn处理句柄集成,或者提供另一种同时建立多个连接的方法?


1
有没有什么原因不使用DBUS接口?这是官方支持的接口,而且很容易同时建立多个连接(一旦您掌握了DBUS的学习曲线)。 - kaylum
不幸的是,我必须在标准Ubuntu 14.04.03 LTS(bluez 4.101)和英特尔Edison(bluez 5.x)上运行代码。 Ubuntu bluez版本为4.101,据我所知,它不正确地支持蓝牙的dbus(或者至少不像5.x那样支持)。我也了解到,bluez dbus GATT仍处于实验阶段,并经常更改。 - mw.
@mw:我也在尝试类似的东西。我想知道你项目的进展情况。 - abhiarora
我曾经使用下面评论中描述的方法,让bluez 4.101和一些早期的5.x版本正常工作。不幸的是,更新的版本将许多蓝牙功能移动到内核中,这破坏了我的代码。修复这个问题变得非常棘手,需要处理内核干扰我的代码所创建的所有异常情况,或者重新编写代码以使用HCI_CHANNEL_USER来禁用bluez/kernel访问并编写自己的ATT/L2CAP例程。 - mw.
1个回答

7

我认为白名单方法是处理同时建立多个连接的唯一方法。HCI只能处理一次建立一个连接,因为(如果我记得正确)在连接建立之前你没有任何连接句柄。

L2CAP套接字是使用HCI方法的内核抽象。如果您在一个连接挂起时尝试启动另一个连接,我认为会出现错误。

我怀疑即使DBUS方法也只是对HCI方法的抽象,它仍然是按顺序建立连接的过程。

即使您使用了白名单方法,我也不确定它实际上会快多少,因为问题在于连接间隔以及广告间隔。白名单通过侦听广告包并在检测到它们时建立连接来工作。我从未使用过白名单方法,但您可能需要使用HCI套接字,并自己处理在一个套接字上复用不同设备的连接。

大多数硬件都允许您在扫描时建立连接,因此您可以在等待当前连接建立时收集新的广告数据包。当连接完成建立后,您可以移至下一个连接。只要连接可以相对快速地建立,使用白名单就没有好处。(实际的底层实现可能是相同的)


1
作为参考,我最终做的是编写一个连接例程,使用hci_le_rm_white_list和hci_le_add_white_list来管理白名单条目。当我想建立连接时,我调用le_create_conn(加入白名单),然后使用此连接建立L2CAP套接字。如果我需要添加更多连接请求,我会使用hci_le_create_conn_cancel停止当前的连接请求,将其添加到白名单中,然后使用le_create_conn恢复。 - mw.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接