Хорошо, по крайней мере я частично обнаружил, почему hcitool требует привилегий root для сканирования LE, но не для обычного сканирования. Частично это означает, что я обнаружил системный вызов, который не выполняется из-за недостаточных привилегий при запуске сканирования LE от имени обычного пользователя.
Ошибка «Операция не разрешена» генерируется системным вызовом writev с блокировкой стека вызовов следующим образом (все функции, реализованные в hci.c , см. В исходном коде bluez):
hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev
Обычное сканирование («сканирование hcitool»), по-видимому, не должно отправлять какие-либо запросы на контроллер, но использует выделенный запрос ioctl , вызывая:
ioctl(dd, HCIINQUIRY, (unsigned long) buf);
Кажется, что доступ на запись к контроллеру Bluetooth ограничен, но почему и как я могу это отключить?