回答:
Linux用のBluetoothプロトコルスタックは、2つの機能をチェックします。機能は、一部の特権を管理するためのまだ一般的なシステムではありません。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...
これは、デバイスのボタンを押して続行します。
OK、少なくとも私は、hcitoolがLEスキャンにはroot権限を必要とするが、通常のスキャンには必要ではない理由を部分的に発見しました。部分的には、LEスキャンを通常のユーザーとして実行すると、権限が不十分なために失敗するシステムコールを見つけたことを意味します。
「Operation not allowed」エラーは、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コントローラへの書き込みアクセスが制限されているようですが、なぜそれを無効にするにはどうすればよいですか?
私はこれをインストールしていませんが、よく書かれたデバイスサブシステムには通常、それに関連付けられたグループがあります。グループにユーザーを追加すると、デバイスにアクセスできます(たとえば、disk
グループはrawハードドライブアクセスを許可します)。ただ、やるls -l
で/dev
これを確認すること。そうでなく、デバイスがroot
グループに属している場合は、udev
検出時のハードウェアの命名、許可、およびアクションを管理するルールを調整することにより、これを変更できます(方法は問わないでください)。
これは、おそらくこの場合に必要なデバイスへの直接アクセスに当てはまります。通常、Bluetoothの通常の機能は、独自の構成、グループ、権限などを備えたデーモンによって処理されます。配布資料を確認してください。グループは多少異なる場合があります。