
Bluetooth LEデバイスのスキャンを実行するにはhciツールどうやらルート権限が必要です。通常のユーザーの場合、出力は次のようになります。
$ hcitool lescan
Set scan parameters failed: Operation not permitted
どしてhciツールLE スキャンにはルート権限が必要ですか?
何らかの方法で非ルートとして LE スキャンを実行することは可能ですか?
答え1
Linux の Bluetooth プロトコル スタックは 2 つの機能をチェックします。機能は、一部の権限を管理するためのまだ一般的ではないシステムです。これらは、PAM モジュールまたは拡張ファイル属性によって処理できます。(https://elixir.bootlin.com/linux/v5.8.10/source/net/bluetooth/hci_sock.c#L1307)
$> 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...
これなら、デバイスのボタンを押してください。
答え2
よし、少なくとも部分的には理由が分かったhciツールLE スキャンにはルート権限が必要ですが、通常のスキャンには必要ありません。部分的には、通常のユーザーとして LE スキャンを実行するときに権限が不十分なために失敗するシステム コールを見つけたことを意味します。
「操作は許可されていません」というエラーは、書くシステムコールでは、コールスタックのロックは次のように行われます(html(bluezのソースコードを参照):
hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev
通常のスキャン(「hcitoolスキャン」)では、コントローラにリクエストを送信する必要はないようですが、専用のioctlリクエスト、呼び出し:
ioctl(dd, HCIINQUIRY, (unsigned long) buf);
Bluetooth コントローラーへの書き込みアクセスが制限されているようですが、なぜですか? また、どうすればそれを無効にすることができますか?
答え3
私はこれをインストールしていませんが、適切に記述されたデバイス サブシステムには通常、グループが関連付けられています。ユーザーをグループに追加すると、デバイスにアクセスできます (たとえば、disk
グループではハード ドライブの raw アクセスが許可されます)。これを確認するにls -l
は、 を実行してください/dev
。そうでない場合で、デバイスがroot
グループに属している場合は、検出時にハードウェアの名前付け、アクセス許可、およびアクションを管理するルールを調整することでこれを変更できますudev
(方法は聞かないでください)。
これは、この場合に必要となる可能性のある直接デバイス アクセスに当てはまります。Bluetooth の通常の機能は、通常、独自の構成、グループ、権限などを持つデーモンによって処理されます。ディストリビューションのドキュメントを確認してください。グループは若干異なる場合があります。