Как узнать # устройств w. блюз

avatar
Maarten ten Velden
8 августа 2021 в 19:44
46
1
0

Я пытался..

int a = socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);
if (a < 0)
{
  return 1;
}

hci_dev_list_req* b;

b = (hci_dev_list_req*)malloc(sizeof (hci_dev_list_req) + HCI_MAX_DEV * sizeof(hci_dev_req));
memset(b, 0, sizeof(hci_dev_list_req) + HCI_MAX_DEV * sizeof(hci_dev_req));

b->dev_num = HCI_MAX_DEV;

int c = ioctl(a, HCIGETDEVLIST, (void*)b);

free(b);
close(a);

if(c < 0)
{
  return 1;
}

printf("b->dev_num %hu\n", b->dev_num);

Однако.. здесь для меня будет напечатано b->dev_num 0. Приведенный выше код в значительной степени представляет собой скопированную вставку из hci_for_each_dev (см.

Что сбивает с толку, так это то, что hci_get_route после этого (после запуска этого кода) не возвращает -1, что не имеет смысла, если смотреть на источник bluez, потому что..

1. HCI_GET_ROUTE всегда назначает результат HCI_FOR_EACH_DEV для возвращаемого значения <773223108351> 2. <197323108353> HCI_IACH_IECH.

ДОКАЗАТЕЛЬСТВО 1. (<19732223108358>источник)..

int hci_get_route(bdaddr_t *bdaddr)
{
    int dev_id;

    dev_id = hci_for_each_dev(HCI_UP, __other_bdaddr,
                (long) (bdaddr ? bdaddr : BDADDR_ANY));
    if (dev_id < 0)
        dev_id = hci_for_each_dev(HCI_UP, __same_bdaddr,
                (long) (bdaddr ? bdaddr : BDADDR_ANY));

    return dev_id;
}

ДОКАЗАТЕЛЬСТВО 2. (<19732223108364>источник)..

    for (i = 0; i < dl->dev_num; i++, dr++) {
        if (hci_test_bit(flag, &dr->dev_opt))
            if (!func || func(sk, dr->dev_id, arg)) {
                dev_id = dr->dev_id;
                break;
            }
    }

Источник

Ответы (1)

avatar
Maarten ten Velden
8 августа 2021 в 20:24
0

Похоже, это может быть ответ..

Вы можете напрямую обращаться к устройству, только если вы являетесь пользователем root (или находитесь в режиме ядра).

источник