Bluetooth LEデバイスのスキャンを実行するには、hcitoolには明らかにroot権限が必要です。通常のユーザーの場合、出力は次のようになります。
$ hcitool lescan
Set scan parameters failed: Operation not permitted
hcitoolがLEスキャンにroot権限を必要とするのはなぜですか?
どういうわけか非ルートとしてLEスキャンを実行することは可能ですか?
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スキャンを実行すると、権限が不十分なために失敗するシステムコールが見つかりました。
「許可されていない操作」エラーは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の通常の機能は、通常、独自の構成、グループ、権限などを持つデーモンを介して処理されます。配布ドキュメントを確認してください。グループは少し異なる場合があります。