在Linux上直接控制HCI设备(旁路蓝牙驱动程序)



我需要直接控制HCI设备,而无需Linux驱动程序/内核干扰。例如,在创建与外围设备的LE连接时,驱动程序正在独立发送我想避免的" LE连接更新"命令。

i虽然有两种解决此问题的方法:

  1. 将蓝牙驱动程序配置为以某种方式禁用对HCI设备的干扰(类似于HCIATTACH上的-r标志(,然后使用常规的AF_Blueooth套接字控制HCI设备。
  2. 禁用此特定的HCI设备,但请保留父char设备并直接连接到它。

到目前为止,我还没有成功找到如何实施这些方法的方法。

我还应该提到,我仍然需要系统"正常"使用的其他HCI设备,因此完全禁用蓝牙驱动程序是一个选择。

我能够实现选项#1。

在蓝牙驱动程序的Linux内核代码中挖掘,我找到了将HCI插座与hci_channel=1绑定的选项。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/d2f2b0c7b46b46b607fcdf79860f79860f8f8664464464646464646bb625fb/scapy/layers/layers/layers/bluetoot.py.pypooth.py#l808

C 的示例:https://github.com/sandeepmistry/node-bluetooth-hci-socket/blob/560a956c3e1421e1421e3136615444444444445b0e71/src/src/bluetoothhcisocket.cpp#l184

相关内容

  • 没有找到相关文章

最新更新