Я хочу полностью программно управлять своим контроллером 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. Любой совет?