Запретить действия драйвера bluetooth?

Я хочу полностью программно управлять своим контроллером Bluetooth с помощью команд HCI. (В основном имитирует поведение других контроллеров Bluetooth, например устройств Android). Однако при работающем драйвере всегда будут автоматически отправляться нежелательные команды. Можно ли как-то предотвратить это? Или это возможно только путем написания собственного драйвера для адаптера Bluetooth? Я особо не пробовал (кроме systemctl stop bluetooth, который явно не работает), потому что не знаю, с чего начать. Может быть, я могу каким-то образом заблокировать исходящие команды Bluetooth и включить его только на короткое время, когда я что-то отправляю? Спасибо.

Изменить: я могу, конечно, отправить свое сообщение hci, а затем отключить устройство hci -> таким образом отправляется только мое сообщение. Но я все еще хочу получать входящее сообщение на контроллер. Я просто не хочу, чтобы хост отправлял сообщение, которое я не указываю.

Edit2: в соответствии с Прямое управление устройством HCI (обход Bluetooth драйверы) в 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. Любой совет?


person Fideliox2    schedule 29.10.2018    source источник


Ответы (1)


sudo hciconfig hci0 down перед созданием сокета пользовательского канала необходим. Кроме этого, смотрите мои правки. Отметить это как выполненное.

person Fideliox2    schedule 29.10.2018