问题描述
我需要直接控制HCI设备,而不会干扰Linux驱动程序/内核.例如,当创建与外围设备的LE连接时,驱动程序会独立发送"LE Connection Update"命令,这是我要避免的.
I need to control an HCI device directly without the Linux drivers/kernel interfering. For example, when creating an LE connection to a peripheral, the driver is independently sending an "LE Connection Update" command which I would like to avoid.
尽管有两种方法可以解决此问题:
I though of two approaches to resolve this:
- 配置蓝牙驱动程序以某种方式禁用对HCI设备的干扰(类似于hciattach上的-r标志),然后使用常规的AF_BLUEOOTH套接字控制HCI设备.
- 禁用此特定的HCI设备,但保留父char设备并直接连接到它.
到目前为止,我还没有成功找到一种方法来实现这些方法.
So far I did not succeed in finding a way of how to implement any of these approaches.
我还应该提到,我仍需要系统使用其他的HCI设备来正常"使用,因此完全禁用蓝牙驱动程序不是一种选择.
I should also mention that I still need a different HCI device to be "normally" used by the system so disabling the bluetooth drivers completely is not an option.
推荐答案
我能够实现选项#1.
挖掘Linux内核代码中的蓝牙驱动程序,我找到了用于将HCI套接字与hci_channel=1
绑定的选项. HCI_USER_CHANNEL
的枚举是1,它导致驱动程序不向HCI设备添加自己的命令.
Digging in the Linux kernel code for bluetooth drivers, I found an option for binding an HCI socket with hci_channel=1
. 1 is the enum for HCI_USER_CHANNEL
which causes the driver not to add its own commands to the HCI device.
要在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
Python's socket module does not support this option. A workaround for the missing support in Python was implemented in 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
If you are interested in the relevant part of the Linux kernel: https://github.com/torvalds/linux/blob/86292b33d4b79ee03e2f43ea0381ef85f077c760/net/bluetooth/hci_sock.c#L1693
这篇关于在Linux上直接控制HCI设备(绕过蓝牙驱动程序)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!