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

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

Solutions Collecting From Web of "使用Linux和Bluez 5.0的多个BLE连接"

我开始了一个答案,所以我可以有更多的空间…

我正在使用Python和C的组合来让我的代码工作,所以我的“代码”可能看起来很有趣,因为它可能来自任何一个。 此外,我使用蓝色4作为5不支持我使用的内核。 让我知道是否有问题,我可以澄清。

似乎有几种做事的方式,但是我最终为不同的任务打开了不同的套接字。 您可以打开一个套接字,然后将套接字选项设置为关闭,您应该将所有数据包放在一个地方。 但是,这是我最初的做法,我发现我的连接会在几秒钟内死亡。

要扫描连接,我打开一个socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)然后在设备0上进行bind 。 (有一个叫做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) ,然后通过使用具有特定设备地址的struct sockaddr_l2调用套接字上的connect来连接到特定设备。 在那个套接字上,你只能从那个设备获取数据包。 (一个警告…我发现我的加密狗不允许连接,而主动扫描正在发生..我不得不临时关闭连接之前,然后再打开它,否则我得到一个来自errno的BUSY错误)

在说完所有这些之后,尽管…我认为你应该在Bluez 5中做所有事情的方式是使用DBUS。 不幸的是,这不是我正在做的一个选择。 我提到的功能是在共享库,显然没有默认安装在5(你必须明确要求它与安装configure )。 他们默认停止安装共享库,因为他们想鼓励人们使用DBUS。

我们结合了hcitool和gatttool的代码。 该代码适用于2设备(扫描,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; 

谢谢,期待意见。