bluetoothctl “Aguardando conectar-se ao bluetoothd…” no script de regras do udev

1

Eu tenho a seguinte regra do udev:

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

que dispara o seguinte 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

e a2dp-fix é o seguinte:

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

Depois de muita intromissão com as variáveis env, eu consegui o material pacmd para o trabalho. No entanto, agora a parte bluetoothctl trava com “Waiting to connect to bluetoothd…” . Isso funciona bem se eu invoco manualmente do shell com sudo /usr/local/bin/a2dp-fix-wrapper , mas não quando o udev o ativa. Eu imagino que deve ser algum tipo de variável env que impeça bluetoothctl de encontrar a instância bluetoothd em execução.

Alguém tem alguma ideia?

    
por aiguofer 30.08.2017 / 22:50

1 resposta

0

Depois de um longo tempo, decidi tentar novamente e finalmente consegui fazer o que eu queria.

Eu tentei algumas coisas que não funcionaram. Em vez de echo -e "connect $device_mac\nquit" | bluetoothctl , tentei:

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

Eu também tentei:

hcitool cc $device_mac

E eu também tentei alguns scripts python, mas no final das contas, usando dbus-send resolvi meu problema.

Meus scripts são os seguintes:

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

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

/ usr / local / bin / a2dp-correção-wrapper

#!/bin/bash

for PID in $(pgrep pulseaudio); do
    USER=$(grep -z USER= /proc/$PID/environ | sed 's/.*=//' | tr -d '
#!/bin/bash

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

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

Agora meu fone de ouvido bluetooth sempre se conecta usando o coletor a2dp :-D

Muito obrigado a este post pela inspiração.

    
por 03.04.2018 / 22:38