bluetoothctl „Warten auf Verbindung mit bluetoothd…“ im udev-Regelskript

bluetoothctl „Warten auf Verbindung mit bluetoothd…“ im udev-Regelskript

Ich habe die folgende Udev-Regel:

ACTION=="add", SUBSYSTEM=="bluetooth", RUN+="/usr/local/bin/a2dp-fix-wrapper"

das folgende Skript auslöst:

PID=$(pgrep pulseaudio)
USER=$(grep -z USER= /proc/$PID/environ | sed 's/.*=//')
USER_ID=$(id -u $USER)
HOME=$(echo $(getent passwd $USER )| cut -d : -f 6)

export XDG_RUNTIME_DIR=/run/user/$USER_ID
export XAUTHORITY=$HOME/.Xauthority
export DISPLAY=:0
export PULSE_RUNTIME_PATH=$XDG_RUNTIME_DIR/pulse/

sleep 5

sudo -u $USER -E /usr/local/bin/a2dp-fix &> /udev_output.txt

und a2dp-fix ist das Folgende:

bt_device_addr=$(pacmd list-cards | grep -i 'name:.*bluez_card' | sed -E 's/.*<?bluez_card\.([A-Z0-9_]+)>?/\1/')
device_mac=$(echo $bt_device_addr | sed 's/_/:/g')

a2dp_available=$(pacmd list-cards | grep -A30 bluez | grep "A2DP Sink" | sed -E 's/.* available: ([a-z]+)\)/\1/g')

if [[ "$a2dp_available" == "no" ]]
then
    echo -e "connect $device_mac\nquit" | bluetoothctl
    sleep 5
    pacmd set-card-profile bluez_card.$bt_device_addr off
    pacmd set-card-profile bluez_card.$bt_device_addr a2dp_sink
    pacmd set-default-sink bluez_sink.$bt_device_addr.a2dp_sink
fi

Nach viel Herumprobieren mit Umgebungsvariablen habe ich das pacmdZeug zum Laufen gebracht. Jetzt bluetoothctlhängt das Teil jedoch mit “Waiting to connect to bluetoothd…”. Das funktioniert einwandfrei, wenn ich es manuell von der Shell aus aufrufe, sudo /usr/local/bin/a2dp-fix-wrapperaber nicht, wenn udev es startet. Ich stelle mir vor, dass es eine Art Umgebungsvariable sein muss, die verhindert, bluetoothctldass die laufende bluetoothdInstanz gefunden wird.

Hat jemand eine Idee?

Antwort1

Nach langer Zeit habe ich mich dazu entschlossen, es noch einmal zu versuchen, und habe es mithilfe von dbus statt bluetoothctl endlich dazu gebracht, das gewünschte Ergebnis zu erzielen.

Ich habe ein paar Dinge ausprobiert, die nicht funktioniert haben. Stattdessen echo -e "connect $device_mac\nquit" | bluetoothctlhabe ich Folgendes ausprobiert:

coproc bluetoothctl
echo -e "select E4:B3:18:48:43:D2\nconnect $device_mac\nquit" >&${COPROC[1]}
output=$(cat <&${COPROC[0]})
echo $output

Ich habe auch versucht:

hcitool cc $device_mac

Ich habe auch ein paar Python-Skripte ausprobiert, aber letztendlich hat die Verwendung dbus-sendmein Problem gelöst.

Meine Skripte sind wie folgt:

/etc/udev/rules.d/80-bt-headset.rules

ACTION=="add", SUBSYSTEM=="bluetooth", RUN+="/usr/local/bin/a2dp-fix-wrapper"

/usr/local/bin/a2dp-fix-wrapper

#!/bin/bash

for PID in $(pgrep pulseaudio); do
    USER=$(grep -z USER= /proc/$PID/environ | sed 's/.*=//' | tr -d '\0')
    USER_ID=$(id -u $USER)
    HOME=$(echo $(getent passwd $USER )| cut -d : -f 6)

    export XDG_RUNTIME_DIR=/run/user/$USER_ID
    export XAUTHORITY=$HOME/.Xauthority
    export DISPLAY=:0

    sleep 5
    if [[ ! -z $USER ]]; then
        sudo -u $USER -E /usr/local/bin/a2dp-fix
    fi
done

/usr/local/bin/a2dp-fix

#!/bin/bash

bt_device_addr=$(pacmd list-cards | grep -i 'name:.*bluez_card' | sed -E 's/.*<?bluez_card\.([A-Z0-9_]+)>?/\1/')
device_mac=$(echo $bt_device_addr | sed 's/_/:/g')

a2dp_available=$(pacmd list-cards | grep -A30 bluez | grep "A2DP Sink" | sed -E 's/.* available: ([a-z]+)\)/\1/g')

if [[ "$a2dp_available" == "no" ]]
then
    dbus-send --system --dest=org.bluez --print-reply /org/bluez/hci0/dev_$bt_device_addr org.bluez.Device1.Connect

    pacmd set-card-profile bluez_card.$bt_device_addr off
    pacmd set-card-profile bluez_card.$bt_device_addr a2dp_sink
    pacmd set-default-sink bluez_sink.$bt_device_addr.a2dp_sink
fi

Jetzt verbindet sich mein Bluetooth-Headset immer über den A2DP-Sink :-D

Großer Dank andieser Beitragfür die Inspiration.

verwandte Informationen