Hello Keith, On Wed, 23 Dec 2020 at 00:34, KeithG <ys3al35l@xxxxxxxxx> wrote: > > I am developing a RPi based audio player. We are trying to add > bluetooth capability to this player. We use alsa and not pulse-audio, > so we need a bit more granular info to get it to run. I have written a > script which is designed to be triggered by udev when a BT device is > added or removed. This script will then use bluetoothctl to get the > capabilities of the device and also add or remove it from a dynamic > database list of MACs in redis. I have a simple script working as I > want from the cli. The key command I am using is 'btmgmt con' which is > the only command I have found that tells me what MACs are currently > connected. I can run this command from the command line as root. I can > set the setuid bit of btmgmt and also get it to run as a user (http in > this case). I cannot, ever, get this command to run when triggered > from udev. I get no response and no error. > > 1) Why is this particular command (query attached BT MACs) not part of > bluetoothctl? Is there a security issue? > 2) Why can I not run 'btmgmt con' in a script (bash or php) triggered > by udev when the device is added or removed? > 3) is there a 'better way' for me to know what device MAC addresses > are attached? I have not found another simple way to get this info. > > What I am doing in the script is: if an audio source is attached, I > want to run a bluealsa-aplay service. When an audio sink is attached, > I want to re-set my audio output to the bluealsa device. If it is not > an audio device, I do not care, but do keep track of what is attached > in my database so that the next time the script runs that it is not > queried and is 'known'. > > Thanks for the help. > > Keith I would suggest that the D-Bus API would be a more appropriate way to get the information you want. The "get managed objects" functionality is a good way to iterate through all the devices that BlueZ knows about. There are examples at: https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test/bluezutils.py https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test/list-devices The D-Bus API also allows your code to execute callbacks when a device is added or its connection state changes. This is done with the InterfacesAdded and PropertiesChanged signals. If you are going to use Python I would suggest the https://pypi.org/project/pydbus/ library is a more "Pythonic" set of D-Bus bindings. The API is documented at: https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc Regards, Barry