Systemd
如何允許非 root systemd 服務使用 dbus 進行 BLE 操作
我一直在製作一個 BLE 外圍設備的原型,該外圍設備在一個類似樹莓的小板上以 root 身份執行。現在我正在強化事情並將 BLE 應用程序分區給非 root 使用者。因此,我將應用程序的 systemd 服務文件更改為:
[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=* “)
我認為我需要做的是以某種方式允許
dbus
此非 root 使用者使用。我看到有一個bluetooth.conf
in/etc/dbus-1/system.d
。我是否需要調整此文件中的某些內容以允許我的應用仍使用 BLE DBus 服務?
在
/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
雖然從技術上講@Mark 的回答回答瞭如何調整 dbus 藍牙配置文件以實現我想要的問題,但我在查看該文件後注意到我希望在發布之前註意到的一些內容。該
bluetooth
組可以使用公共汽車。所以對我來說更容易(也許更正確?)的事情就是將我的非 root 使用者添加到藍牙組。這也可以讓事情正常工作。