Answers:
用于Linux的蓝牙协议栈检查两种功能。功能是管理某些特权的尚不常见的系统。它们可以由PAM模块或扩展文件属性处理。(请参阅http://lxr.free-electrons.com/source/net/bluetooth/hci_sock.c#L619)
$> sudo apt-get install libcap2-bin
安装linux功能操纵工具。
$> sudo setcap 'cap_net_raw,cap_net_admin+eip' `which hcitool`
像setuid位一样在可执行文件上设置缺少的功能。
$> getcap !$
getcap `which hcitool`
/usr/bin/hcitool = cap_net_admin,cap_net_raw+eip
所以我们很高兴去:
$>hcitool -i hci0 lescan
Set scan parameters failed: Input/output error
是的,您的BT适配器不支持BLE
$>hcitool -i hci1 lescan
LE Scan...
这样做,继续并按设备上的按钮。
好的,至少我部分地发现了为什么hcitool要求LE扫描具有root特权而不是正常扫描。从某种意义上说,我找到了以普通用户身份运行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);
似乎对蓝牙控制器的写访问受到限制,但是为什么以及如何禁用它?