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

使用Linux和Bluez 5.0的多个BLE连接,linux,bluetooth-lowenergy,bluez,Linux,Bluetooth Lowenergy,Bluez,我目前正在尝试使用BlueZ 5.0和Linux连接到多个BLE设备。我有一个主机BLE适配器,我修改了gatttool以连接并执行此功能。如果我运行一个修改过的gatttool实例,我将成功连接并从BLE设备接收通知数据。如果我运行另一个修改过的gatttool实例并连接到另一个BLE设备,此应用程序将开始从两个BLE设备接收通知数据,并且初始应用程序不再接收任何数据。我认为这是由于套接字设置,其中两个应用程序都将其套接字配置为相同的地址和PSM(最新实例接收数据,而另一个实例缺少数据)。有没

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

我开始回答,以便有更多的空间

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

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

为了扫描连接,我打开了一个
插座(蓝牙、SOCK\u RAW、BTPROTO\u HCI)
然后在设备
0
上进行了
bind
。(有一个名为
hci\u get\u route
的函数来获取可用的设备号码)然后你可以调用
hci\u le\u set\u scan\u parameters
来设置选项,
setsockopt(SOL\u hci,hci\u FILTER,FILTER)
来获取le扫描事件,然后调用
hci\u le\u set\u scan\u enable来打开扫描

每个设备连接都是通过一个
套接字(AF_BLUETOOTH,SOCK_SEQPACKET,BTPROTO_L2CAP)
进行的,然后通过调用带有特定设备地址的
struct sockaddr_l2
套接字上的
connect来告诉它连接到特定设备。在该套接字上,您应该只从该设备获取数据包。(有一个警告…我发现我的加密狗在进行活动扫描时不允许连接..我必须在连接之前暂时关闭它,然后再打开它。否则,我会收到来自errno的忙错误)


说了这么多之后。。。我认为在Bluez5中,您应该使用DBUS来完成所有工作。不幸的是,对于我所做的事情来说,这并不是一个真正的选择。我提到的函数在共享库中,在5中默认情况下没有安装(您必须明确要求它与
configure
一起安装)。默认情况下,他们停止安装共享库,因为他们希望鼓励人们改用DBUS。

我们将hcitool和gattool中的代码组合在一起。该代码适用于2个设备(扫描、hci_le_创建_连接和gatt_连接)。我相信使用的设备数量没有限制

1 Start cmd_lescan (from hcitool.c)
2.For each device scanned - 
      cmd_lecc (from hcitool.c)
      gatt_connect (from gatttool.c)
这样,一个进程可以管理多个可扩展设备。我们不必关闭扫描,只需忽略非广告信息:

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

谢谢,期待您的评论。

这不是您想要的吗?如果您希望一个应用程序连接到多个设备,那么可以通过单个套接字来实现。我相信每条信息都带有设备的BT地址,因此您可以将其与正确的设备相关联。我现在明白我应该使用一个套接字。ACL连接句柄应用于分隔数据。我很难通过BlueZ访问此手柄。套接字(PF_蓝牙、SOCK_流、BTPROTO_RFCOMM)创建套接字。connect(sock,(struct sockaddr*)&addr,sizeof(addr))连接套接字。使用ioctl(socket,HCIGETCONNINFO,cr)访问句柄将返回一个errno 2(无文件)。目的地地址正确。上面我创建的套接字返回值5,而socket=hci_open_dev(dev_id)返回值6。有没有更好的方法来获取此句柄。ioctl(socket,HCIGETCONNINFO,cr)方法对蓝牙经典设备很好,但对不可扩展设备不起作用。我需要一种方法来访问用于数据配对目的的BLE设备的ACL数据句柄。这对BlueZ可能吗?我也有类似的问题。请解释一下你们的实验结果?我想先解决这个问题,不使用DBUS。我需要检索与传入套接字数据关联的句柄,以便将数据与正确的连接关联起来。ioctl(socket,HCIGETCONNINFO,cr)调用不适用于可扩展设备。您是否有方法访问与连接和传入数据关联的句柄信息?我不确定我是否理解。。。你没有启动连接吗?在这种情况下,您是否已经有了句柄,并且知道您连接到了什么?当我执行connect(socket,(struct sockaddr*)&addr,sizeof(addr))时,返回一个值0,表示已进行套接字连接。如果同时运行hcidump,我会看到句柄1025被分配给连接。该连接的其他数据事务使用该句柄。我正在尝试访问该句柄。该句柄是否与套接字/文件描述符相同?您可以尝试查看sockaddr结构。我想我是让python帮我做那部分。。。请稍候,fd应位于
套接字
变量中。您能解释一下为什么要使用cmd_lecc和GATT_connect对同一设备进行两次连接吗?