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

我需要直接控制一个HCI设备,而不需要Linux驱动程序/内核干扰。 例如,当创build到外设的LE连接时,驱动程序正在独立地发送“LE连接更新”命令,我想避免这种情况。

我虽然有两种方法来解决这个问题:

  1. configuration蓝牙驱动程序以某种方式禁用对HCI设备的干扰(类似于hciattach上的-r标志),然后使用常规的AF_BLUEOOTH套接字来控制HCI设备。
  2. 禁用这个特定的HCI设备,但保留父字符设备并直接连接到它。

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

我还应该提到,我仍然需要一个不同的HCI设备来“正常”地使用系统,所以完全禁用蓝牙驱动程序不是一个select。

Solutions Collecting From Web of "在Linux上直接控制HCI设备(绕过蓝牙驱动程序)"

我能够实现选项#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的套接字模块不支持这个选项。 Python中缺少支持的解决方法是在Scapy中实现的: https : //github.com/secdev/scapy/blob/d2f2b0c7b46b607fcdf79860f8f866446bb625fb/scapy/layers/bluetooth.py#L808

C ++示例: https : //github.com/sandeepmistry/node-bluetooth-hci-socket/blob/560a956c3e1421e31366115444ca9027d45b0e71/src/BluetoothHciSocket.cpp#L184

如果您对Linux内核的相关部分感兴趣: https : //github.com/torvalds/linux/blob/86292b33d4b79ee03e2f43ea0381ef85f077c760/net/bluetooth/hci_sock.c#L1693