저는 작은 라즈베리 보드에서 루트로 실행되는 BLE 주변 장치의 프로토타입을 제작해 왔습니다. 이제 무언가를 강화하고 BLE 애플리케이션을 루트가 아닌 사용자에게 분할하고 있습니다. 따라서 애플리케이션의 시스템 서비스 파일을 다음과 같이 변경했습니다.
[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
루트가 아닌 사용자에게 특정 용도를 허용하는 것입니다. 거기에 하나 bluetooth.conf
가 있습니다 . /etc/dbus-1/system.d
내 애플리케이션이 BLE DBus 서비스를 계속 사용할 수 있도록 하려면 이 파일에서 뭔가를 조정해야 합니까?
답변1
기술적으로 @Mark의 답변은 내가 원하는 것을 달성하기 위해 dbus 블루투스 프로필을 조정하는 방법에 대한 질문에 대답했지만, 파일을 살펴본 후 게시하기 전에 알아차렸으면 좋았을 내용을 발견했습니다. 그룹 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