目前我正在试图连接到使用5.0的BlueZ和Linux的多个BLE装置。 我有一个主机BLE适配器和我已经修改了gatttool连接并执行此功能。 如果我运行修改gatttool的一个实例,我成功地连接,并从BLE设备接收通知数据。 如果我运行修改gatttool的另一个实例,并连接到另一BLE装置,该应用程序开始从两个BLE设备和初始应用程序不再接收任何数据接收通知数据。 我相信这是由于插座的设置,其中两个应用程序配置各自的插槽,以相同的地址和PSM(而其他被饿死的最新实例接收数据)。 是否有办法防止这种情况? 理想情况下,我想一个应用程序连接到多个设备。 我假定应用程序只能有多个插座将有相同的问题,因为上面的多个实例的原因一个插座。 我的BLE装置是TI CC2540密钥卡充当心率监视器。
Answer 1:
我开始一个答案,所以我可以有更多的空间......
我使用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
具有特定的设备地址在里面。 在该套接字,你应该只得到来自该设备的数据包。 (一个警告......我发现我的狗不会允许一个连接,同时主动扫描正在发生。我不得不只连接之前暂时关闭它,然后重新打开它,否则我从错误号繁忙错误)
说一切之后,虽然......我想你应该在配合bluez 5做的一切的方法是使用DBUS。 不幸的是,这不是真的,因为我在做什么的选项。 我提到的功能是,显然是默认不安装5共享库(你必须明确地提出要求与安装configure
)。 他们停止了默认安装的共享库,因为他们想鼓励人们使用DBUS代替。
Answer 2:
我们结合从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;
感谢和期待的意见。