解决方法
我正在使用Python和C的组合来使我的代码工作,所以我的“代码”可能看起来很有趣,因为它可能来自其中之一.另外,我使用Bluez 4,因为5不支持我正在使用的内核.如果有问题请告诉我,我可以澄清一下.
似乎有几种做法,但我最终为不同的任务打开了单独的套接字.您可以打开一个插槽,然后设置套接字选项以进行过滤,您应该在一个地方获取所有数据包.然而,这是我最初的做法,我发现我的连接会在几秒钟内死亡.
为了扫描连接,我打开了一个套接字(AF_BLUETOOTH,SOCK_RAW,BTPROTO_HCI),然后在设备0上进行了绑定.(有一个名为hci_get_route的函数来获取可用的设备编号)然后可以调用hci_le_set_scan_parameters来设置选项,setsockopt(SOL_HCI,HCI_FILTER),过滤)获得LE扫描事件,然后调用hci_le_set_scan_enable打开扫描.
每个设备连接都使用一个套接字(AF_BLUETOOTH,SOCK_SEQPACKET,BTPROTO_L2CAP),然后通过在套接字上调用具有特定设备地址的struct sockaddr_l2来连接到特定设备.在该套接字上,您应该只从该设备获取数据包. (一个警告……我发现我的加密狗在进行主动扫描时不允许连接..我必须在连接之前暂时将其关闭然后重新打开.否则我从errno得到一个BUSY错误)
在说了所有这些之后,虽然……我认为你应该在Bluez 5中做所有事情的方式是使用DBUS.不幸的是,这对我所做的事情来说并不是一个真正的选择.我提到的功能是在共享库中,默认情况下显然没有安装在5中(您必须明确要求使用configure安装它).他们默认停止安装共享库,因为他们希望鼓励人们使用DBUS.