我目前正在尝试使用 BlueZ 5.0 和 Linux 连接到多个 BLE 设备。我有一个主机 BLE 适配器,并且我修改了 gatttool 以连接并执行此功能。如果我运行修改后的 gatttool 的实例,我会成功连接并接收来自 BLE 设备的通知数据。如果我运行修改后的 gatttool 的另一个实例并连接到另一个 BLE 设备,则此应用程序开始从两个 BLE 设备接收通知数据,并且初始应用程序不再接收任何数据。我相信这是由于套接字设置,两个应用程序都将它们的套接字配置为相同的地址和 PSM(最新的实例接收数据,而另一个实例则处于饥饿状态)。有没有办法防止这种情况?理想情况下,我希望一个应用程序连接到多个设备。我假设应用程序只能有一个套接字,因为多个套接字将与上述多个实例具有相同的问题。我的 BLE 设备是用作心率监测器的 TI CC2540 钥匙扣。
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
以打开扫描。
每个设备连接都是使用 a 建立的,然后您通过调用带有特定设备地址的套接字socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)
来告诉它连接到特定设备。在该套接字上,您应该只从该设备获取数据包。(一个警告......我发现我的加密狗在进行主动扫描时不允许连接......我不得不在连接之前暂时关闭它,然后重新打开它。否则我收到来自 errno 的 BUSY 错误)connect
struct sockaddr_l2
说了这么多之后……我认为你应该在 Bluez 5 中做所有事情的方式是使用 DBUS。不幸的是,这并不是我正在做的事情的真正选择。我提到的功能在共享库中,显然默认情况下没有安装在 5 中(您必须明确要求它与 一起安装configure
)。他们默认停止安装共享库,因为他们想鼓励人们改用 DBUS。
我们结合了来自 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;
感谢并期待评论。