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

我需要在没有Linux驱动程序/内核干扰的情况下直接控制HCI设备.例如,在创建到外围设备的LE连接时,驱动程序独立发送“LE连接更新”命令,我想避免.

我有两种解决方法:

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

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

我还应该提一下,我仍然需要一个不同的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的套接字模块不支持此选项.在Scapy中实现了Python中缺少支持的解决方法:
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

上一篇:java – Android蓝牙 – 检测设备断开连接


下一篇:android – 如何使用Mockito模拟上下文?