防止蓝牙驱动程序动作?

时间:2018-10-29 14:32:58

标签: linux bluetooth hci

我想用HCI命令完全以编程方式控制我的蓝牙控制器。 (基本上模仿其他蓝牙控制器(例如android设备)的行为) 但是,在驱动程序运行的情况下,总会自动发送不需要的命令。 是否有可能防止这种情况发生? 还是只能通过基本编写自己的蓝牙适配器驱动程序来实现? 我并没有真正尝试(除了systemctl stop bluetooth之外,这显然行不通),因为我不知道从哪里开始。 也许我可以以某种方式阻止传出的蓝牙命令,并且仅在发送某些内容时才将其启用? 谢谢。

编辑:我当然可以发送我的hci消息,然后关闭hci设备->这样,仅发送我的消息。但是我仍然想接收传入到控制器的消息。我只是不希望主持人发送我未指定的消息。

Edit2:根据Direct Control of HCI Device (Bypass Bluetooth Drivers) on Linux,有HCI_USER_CHANNEl,这基本上是我想要的。我从那里获取代码来编写一个函数:

#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设备上我什么也没运行。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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