我想用hci命令完全以编程方式控制我的蓝牙控制器。(基本上模仿其他蓝牙控制器的行为,例如Android设备)
但是,在驱动程序运行时,总会有不需要的命令自动发送。
有没有可能阻止这种情况?
或者这仅仅是通过为蓝牙适配器编写自己的驱动程序来实现的吗?
我并没有尝试太多(除了systemctl stop bluetooth,这显然不起作用),因为我不知道从哪里开始。
也许我可以阻止传出的蓝牙命令,而只是在我发送东西时很快启用它?
谢谢。
编辑:我当然可以发送我的HCI信息,然后关闭HCI设备->这样只发送我的信息。但我仍然想接收到控制器的传入消息。我只是不希望主机发送我没有指定的消息。
编辑2:根据Direct Control of HCI Device (Bypass Bluetooth Drivers) on Linux有hci_用户通道,这基本上就是我想要的。我从那里获取代码来编写一个函数:

#include <errno.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BTPROTO_HCI   1

struct sockaddr_hci {
sa_family_t     hci_family;
unsigned short  hci_dev;
unsigned short  hci_channel;
};

extern "C" int usocket(){

    int sock = socket(AF_BLUETOOTH, SOCK_RAW ,  BTPROTO_HCI);
    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

    int ret = bind(sock, (struct sockaddr *) &a, sizeof(a));
    if(ret==-1){
       perror("Error binding socket. Errno: ");
       return -1;
    }
    return sock;
  }

然而,调用它总是会导致“设备或资源繁忙”,但我没有在hci设备上运行任何东西。有什么建议吗?

最佳答案

sudo hciconfig hci0 down需要在创建用户通道套接字之前。除此之外,请参阅我的编辑。将此标记为已完成。

10-07 22:27