bluetoothctl "Esperando conectarse a bluetoothd..." en el script de regla udev

bluetoothctl "Esperando conectarse a bluetoothd..." en el script de regla udev

Tengo la siguiente regla udev:

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

que dispara el siguiente script:

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

y a2dp-fix es el siguiente:

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

Después de muchas intromisiones con las variables env, conseguí que pacmdtodo funcionara. Sin embargo, ahora la bluetoothctlparte se queda con “Waiting to connect to bluetoothd…”. Esto funciona bien si lo invoco manualmente desde el shell sudo /usr/local/bin/a2dp-fix-wrapperpero no cuando lo inicia udev. Me imagino que debe ser algún tipo de variable env que impide bluetoothctlencontrar la bluetoothdinstancia en ejecución.

¿Alguien tiene alguna idea?

Respuesta1

Después de mucho tiempo, decidí intentarlo de nuevo y finalmente logré hacer lo que quiero usando dbus en lugar de bluetoothctl.

Intenté algunas cosas que no funcionaron. En lugar de echo -e "connect $device_mac\nquit" | bluetoothctllo intenté:

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

También probé:

hcitool cc $device_mac

Y también probé un par de scripts de Python, pero finalmente el uso dbus-sendresolvió mi problema.

Mis guiones son los siguientes:

/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

Ahora mis auriculares bluetooth siempre se conectan usando el disipador a2dp :-D

Muchas gracias aesta publicaciónpor la inspiración.

información relacionada