ルート以外のシステムサービスがBLE操作にdbusを使用できるようにする方法

ルート以外のシステムサービスがBLE操作にdbusを使用できるようにする方法

私は小さなラズベリーボードでルートとして実行されるBLE周辺機器のプロトタイプを製作してきました。今何かを強化し、BLEアプリケーションをrootではなくユーザーに分割しています。そのため、アプリケーションのシステムサービスファイルを次のように変更しました。

[Unit]
Description=BLE Peripheral

[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /opt/myPeripheral/bleMainloop
WorkingDirectory=/opt/myPeripheral
StandardOutput=journal
Restart=on-failure
User=blePeripheral

[Install]
WantedBy=multi-user.target 

Userユーザーとして実行フィールドを追加した後、blePeripheral次の理由で実行が失敗します。

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 2 matched rules; type="method_call", sender=":1.6797" (uid=107 pid=17300 comm="/usr/bin/python3 -u /opt/pilot/bleMainloop ") interface="org.freedesktop.DBus.ObjectManager" member="GetManagedObjects" error name="(unset)" requested_reply="0" destination=":1.2" (uid=0 pid=1373 comm="/usr/lib/bluetooth/bluetoothd -d -E --noplugin=* “)

考える私がしなければならないことは、dbusroot以外のユーザーに特定の用途を許可することです。そこに一つbluetooth.confがあります。/etc/dbus-1/system.dアプリケーションがBLE DBusサービスを引き続き使用できるようにするには、このファイルで何かを調整する必要がありますか?

答え1

技術的に@Markの答えは、私が望むことを達成するためにdbus Bluetoothプロファイルを調整する方法に関する質問に答えましたが、ファイルを見た後に投稿する前に気付いたことがわかりました。グループbluetoothはバスを利用できます。したがって、私にとってより簡単な(おそらくより正確ですか?)方法は、rootではなくユーザーをBluetoothグループに追加することです。これにより、すべてがシームレスに実行されるようになります。

答え2

/etc/dbus-1/system.d/bluetooth.conf以下を追加してみてください。

<policy user="blePeripheral">
  <allow own="org.bluez"/>
  <allow send_destination="org.bluez"/>
  <allow send_interface="org.bluez.GattCharacteristic1"/>
  <allow send_interface="org.bluez.GattDescriptor1"/>
  <allow send_interface="org.freedesktop.DBus.ObjectManager"/>
  <allow send_interface="org.freedesktop.DBus.Properties"/>
</policy>

その後、dbus サービスを再起動します。

systemctl restart dbus

関連情報