我需要在没有Linux驱动程序/内核干扰的情况下直接控制HCI设备。例如,在创建与外设的LE连接时,驱动程序独立发送“LE连接更新”命令,我希望避免这种情况。
我有两种方法可以解决这个问题:
到目前为止,我没有成功找到如何实施这些方法的方法。
我还应该提一下,我仍然需要系统“正常”使用不同的HCI设备,因此完全禁用蓝牙驱动程序不是一种选择。
答案 0 :(得分:3)
我能够实现选项#1。
在蓝牙驱动程序的Linux内核代码中,我找到了一个用hci_channel=1
绑定HCI套接字的选项。 1是HCI_USER_CHANNEL
的枚举,它导致驱动程序不将自己的命令添加到HCI设备。
要在C中实现此目的:
struct sockaddr_hci {
sa_family_t hci_family;
unsigned short hci_dev;
unsigned short hci_channel;
};
struct sockaddr_hci a;
memset(&a, 0, sizeof(a));
a.hci_family = AF_BLUETOOTH;
a.hci_dev = 0; //0 for hci0
a.hci_channel = 1; //1 for HCI_CHANNEL_USER
bind(sock, (struct sockaddr *) &a, sizeof(a));
要在Python中实现这一目标:
Python的套接字模块不支持此选项。在Scapy中实现了Python中缺少支持的解决方法: https://github.com/secdev/scapy/blob/d2f2b0c7b46b607fcdf79860f8f866446bb625fb/scapy/layers/bluetooth.py#L808
如果您对Linux内核的相关部分感兴趣:https://github.com/torvalds/linux/blob/86292b33d4b79ee03e2f43ea0381ef85f077c760/net/bluetooth/hci_sock.c#L1693