我使用Python和C的组合来让我的代码正常运行,所以我的“代码”可能看起来很奇怪,因为它可能是从任何一种语言中来的。此外,我使用了Bluez 4,因为5不支持我正在使用的内核。如果有问题,请告诉我,我可以澄清。
似乎有几种方法可以做到这一点,但我最终选择了为不同的任务打开单独的套接字。你可以打开一个单一的套接字,然后设置套接字选项以取消过滤,这样你应该能够在一个地方得到所有的数据包。然而,那是我的最初做法,我发现我的连接会在几秒钟内死掉。
要扫描连接,我打开了一个socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)
,然后在设备0
上执行了bind
。(有一个叫做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
中来告诉它连接到特定设备。在该套接字上,您应该只能从该设备获取数据包。(一个注意点...我发现我的适配器在进行活动扫描时不允许连接...我必须在连接之前暂时关闭它,然后再打开它。否则,我将从errno中得到一个BUSY错误)
虽然这么说了,但我认为你应该使用DBUS来完成Bluez 5中的所有操作。不幸的是,对于我正在做的事情,这不是一个真正的选项。我提到的函数在共享库中,这个共享库显然在5中没有默认安装(您必须使用configure
明确要求安装)。他们停止默认安装共享库,因为他们想鼓励人们使用DBUS。
socket
变量中。 - Tim Tisdall1 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;