我目前正在尝试使用BlueZ 5.0和Linux连接到多个BLE设备。我有一个主机BLE适配器,并且我修改了gatttool以连接并执行此功能。如果运行修改后的gatttool的实例,则可以成功连接并从BLE设备接收通知数据。如果我运行修改后的gatttool的另一个实例并连接到另一个BLE设备,则此应用程序开始从两个BLE设备接收通知数据,并且初始应用程序不再接收任何数据。我认为这是由于套接字设置而引起的,其中两个应用程序都将其套接字配置为相同的地址和PSM(最新的实例接收数据,而另一个实例却处于饥饿状态)。有办法防止这种情况吗?理想情况下,我希望一个应用程序连接到多个设备。我假设该应用程序只能有一个套接字,原因是多个套接字将具有与上述多个实例相同的问题。我的BLE设备是TI CC2540钥匙扣,用作心率监测器。
我开始回答,所以我可以有更多的空间...
我正在使用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。
我们已经将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;
谢谢,期待评论。
您如何在python中使用带有pexpect的生成gatttools来连接BLE设备?您能提供一个代码吗?