在 Linux 上直接控制 HCI 设备(绕过蓝牙驱动程序)
Direct Control of HCI Device (Bypass Bluetooth Drivers) on Linux
我需要在不受 Linux drivers/kernel 干扰的情况下直接控制 HCI 设备。例如,当创建到外围设备的 LE 连接时,驱动程序独立发送一个 "LE Connection Update" 命令,我想避免这种情况。
我想出了两种方法来解决这个问题:
- 配置蓝牙驱动程序以某种方式禁用对 HCI 设备的干扰(类似于 hciattach 上的 -r 标志),然后使用常规 AF_BLUEOOTH 套接字控制 HCI 设备。
- 禁用这个特定的 HCI 设备,但保留父字符设备并直接连接到它。
到目前为止,我还没有成功找到实施这些方法的方法。
我还应该提到,我仍然需要一个不同的 HCI 设备供系统使用 "normally",因此完全禁用蓝牙驱动程序不是一个选项。
我能够实现选项 #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的套接字模块不支持这个选项。 Python 中缺少支持的解决方法已在 Scapy 中实现:
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
我需要在不受 Linux drivers/kernel 干扰的情况下直接控制 HCI 设备。例如,当创建到外围设备的 LE 连接时,驱动程序独立发送一个 "LE Connection Update" 命令,我想避免这种情况。
我想出了两种方法来解决这个问题:
- 配置蓝牙驱动程序以某种方式禁用对 HCI 设备的干扰(类似于 hciattach 上的 -r 标志),然后使用常规 AF_BLUEOOTH 套接字控制 HCI 设备。
- 禁用这个特定的 HCI 设备,但保留父字符设备并直接连接到它。
到目前为止,我还没有成功找到实施这些方法的方法。
我还应该提到,我仍然需要一个不同的 HCI 设备供系统使用 "normally",因此完全禁用蓝牙驱动程序不是一个选项。
我能够实现选项 #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的套接字模块不支持这个选项。 Python 中缺少支持的解决方法已在 Scapy 中实现: 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