Cách cho phép dịch vụ systemd không root sử dụng dbus cho hoạt động BLE


8

Tôi đã tạo ra một thiết bị ngoại vi BLE chạy bằng root trên một quả mâm xôi nhỏ như bảng. Bây giờ tôi đang làm cứng mọi thứ và phân vùng ứng dụng BLE cho người dùng không root. Vì vậy, tôi đã thay đổi tệp dịch vụ systemd của mình cho ứng dụng giống như:

[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 

Đã thêm Usertrường để chạy với tư cách blePeripheralngười dùng, giờ nó không khởi động được do:

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=* “)

Tôi nghĩ rằng những gì tôi cần làm là bằng cách nào đó cho phép sử dụng nhất định dbuscho người dùng không root này. Tôi thấy rằng có một bluetooth.conftrong /etc/dbus-1/system.d. Tôi có cần điều chỉnh một cái gì đó trong tệp này để cho phép ứng dụng của tôi vẫn sử dụng các dịch vụ BLE DBus không?

Câu trả lời:


7

Trong /etc/dbus-1/system.d/bluetooth.conf, hãy thử thêm điều này:

<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>

Sau đó khởi động lại dịch vụ dbus:

systemctl restart dbus

7

Trong khi về mặt kỹ thuật, câu trả lời của @ Mark đã trả lời câu hỏi về cách điều chỉnh tệp cấu hình bluetooth dbus để đạt được những gì tôi muốn, tôi nhận thấy sau khi xem trong tệp đó một cái gì đó tôi muốn tôi nhận thấy trước khi đăng. Các bluetoothnhóm được tiếp cận với xe buýt. Vì vậy, điều dễ dàng hơn (có lẽ chính xác hơn?) Đối với tôi chỉ đơn giản là thêm người dùng không root của tôi vào nhóm bluetooth. Điều này cũng cho phép mọi thứ hoạt động tốt.


1
Bạn đang sử dụng BLE để kết nối với các thiết bị khác hay ứng dụng của bạn quảng cáo dịch vụ qua BLE? Tôi đã thử các giải pháp đó, nhưng quảng cáo vẫn không hoạt động nếu không có quyền root.
pwuertz

Quả mâm xôi của tôi như bảng đang đóng vai trò ngoại vi. Vì vậy, có, nó là quảng cáo. Tôi đang sử dụng kéo dài debian với kernel 4.8.10 và bluez 5.43. Tôi đã sử dụng jessie với cùng một thiết lập. Bạn làm phải tinh chỉnh các daemon bluetooth để chạy với -E (thử nghiệm) cờ. HTH @pwuertz
Travis Griggs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.