使用Linux和Bluez 5.0的多个BLE连接

时间:2013-04-25 20:56:55

标签: linux bluetooth-lowenergy bluez

我目前正在尝试使用BlueZ 5.0和Linux连接到多个BLE设备。我有一个主机BLE适配器,我修改了gatttool连接并执行此功能。如果我运行修改后的gatttool的实例,我成功连接并接收来自BLE设备的通知数据。如果我运行修改后的gatttool的另一个实例并连接到另一个BLE设备,则此应用程序开始从两个BLE设备接收通知数据,并且初始应用程序不再接收任何数据。我相信这是由于套接字设置,其中两个应用程序都将其套接字配置为相同的地址和PSM(最新的实例接收数据而另一个是饥饿的)。有没有办法防止这种情况?理想情况下,我希望一个应用程序连接到多个设备。我假设应用程序只能有一个套接字,因为多个套接字与上面的多个实例具有相同的问题。我的BLE设备是TI CC2540密钥卡,用作心率监视器。

2 个答案:

答案 0 :(得分:2)

我开始回答所以我可以有更多的空间......

我正在使用Python和C的组合来使我的代码工作,所以我的“代码”可能看起来很有趣,因为它可能来自其中之一。另外,我使用Bluez 4,因为5不支持我正在使用的内核。如果有问题请告诉我,我可以澄清一下。

似乎有几种做法,但我最终为不同的任务打开单独的套接字。您可以打开一个套接字,然后设置套接字选项以过滤掉,您应该在一个地方获取所有数据包。然而,这是我最初的做法,我发现我的连接会在几秒钟内死亡。

要扫描连接,我打开了socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI),然后在设备bind上执行了0。 (有一个名为hci_get_route的函数可以获取可用的设备编号)然后,您可以调用hci_le_set_scan_parameters来设置选项,setsockopt(SOL_HCI, HCI_FILTER, filter)来获取LE扫描事件,然后调用hci_le_set_scan_enable打开扫描。

每个设备连接都是使用socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)建立的,然后通过调用套接字上的connect并使用其中包含特定设备地址的struct sockaddr_l2来连接到特定设备。在该套接字上,您应该只从该设备获取数据包。 (一个警告......我发现我的加密狗在进行主动扫描时不允许连接..我必须在连接之前暂时将其关闭然后重新打开。否则我从errno得到一个BUSY错误)

在说了所有这些之后,虽然......我认为你应该在Bluez 5中做所有事情的方式是使用DBUS。不幸的是,这不是我正在做的事情的一个选择。我提到的函数位于共享库中,默认情况下显然没有安装在5中(您必须明确要求它与configure一起安装)。他们默认停止安装共享库,因为他们希望鼓励人们使用DBUS。

答案 1 :(得分:1)

我们结合了hcitool和gatttool的代码。该代码适用于2个设备(scan,hci_le_create_conn和gatt_connect)。我相信使用的设备数量没有限制。

1 Start cmd_lescan (from hcitool.c)
2.For each device scanned - 
      cmd_lecc (from hcitool.c)
      gatt_connect (from gatttool.c)

这样一个进程就可以管理多个BLE设备。我们不必关闭扫描,只需忽略非广告消息:

        if (meta->subevent != 0x02)
                continue; 

感谢并期待发表评论。