2015-11-02 180 views
3

我有一个Linux C应用程序,它需要与BLE设备建立多个连接。该应用程序使用从gatttool剥离的库。 BLE设备的广告费率非常低,因此需要很长时间才能建立连接。因此,我需要能够同时发出多个gatt_connect请求。使用BlueZ同时建立多个BLE连接

gatt_connect使用标准套接字/连接来建立到设备的L2CAP连接。虽然此方法允许您拥有多个活动连接,但它只允许您一次建立一个连接。使用HCI接口,您可以同时建立多个接口(即hcitool lecc --whitelist),但是我无法想出一个方法使它与gattool库L2CAP套接字/连接一起工作。

任何人都可以提出一种方法来集成gattool L2CAP套接字/连接与hci接口(hci_open_dev/hci_le_create_conn)处理使用的“hcitool lecc --whitelist”,或一种方法来同时建立多个连接?

+1

为什么不使用DBUS接口的任何原因?这是支持的接口,并且很容易同时建立多个连接(一旦你通过DBUS学习曲线)。 – kaylum

+0

不幸的是,我必须在标准的ubuntu 14.04.03 LTS(bluez 4.101)和Intel Edison(bluez 5.x)上运行代码。 Ubuntu的bluez版本是4.101,据我的理解,它不能正确支持蓝色的dbus(或者至少不支持5.x的相同方式)。我也明白,关贸总协定仍然是试验性和经常变化的。 –

+0

@mw。 :我也在尝试类似的东西。我想知道你的项目的状态。 – abhiarora

回答

4

我认为白名单方法是一次处理建立多个连接的唯一方法。 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继续。 –