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