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

问题描述 投票:5回答:3

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

linux bluetooth-lowenergy bluez
3个回答
2
投票

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

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

似乎有几种处理方法,但是我最终为不同的任务打开了separate套接字。您可以打开一个套接字,然后设置套接字选项以取消过滤,并且应该将所有数据包放在一个位置。但是,这是我的最初方式,我发现我的连接会在几秒钟内消失。

要扫描连接,我打开了一个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来告诉您连接到特定设备。在该套接字上,您只能从该设备获取数据包。 (一个警告。。。我发现在进行主动扫描时,我的加密狗不允许连接。。在连接之前,我不得不暂时将其关闭,然后重新打开。 )

尽管说了所有这些,但是...我认为您应该在Bluez 5中执行所有操作的方式是使用DBUS。不幸的是,这并不是我所做的选择。我提到的功能在共享库中,显然在5中默认情况下未安装(您必须明确要求将其与configure一起安装)。他们停止默认安装共享库,因为他们想鼓励人们改用DBUS。


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; 

谢谢,期待评论。


0
投票

您如何在python中使用带有pexpect的生成gatttools来连接BLE设备?您能提供一个代码吗?

© www.soinside.com 2019 - 2024. All rights reserved.