udev 규칙 스크립트의 bluetoothctl "bluetoothd 연결을 기다리는 중..."

udev 규칙 스크립트의 bluetoothctl "bluetoothd 연결을 기다리는 중..."

다음 udev 규칙이 있습니다.

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

그러면 다음 스크립트가 실행됩니다.

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

a2dp-fix는 다음과 같습니다:

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

env 변수에 많은 간섭을 한 후에 pacmd작업이 가능해졌습니다. 그러나 이제 bluetoothctl부품이 “Waiting to connect to bluetoothd…”. 쉘에서 수동으로 호출하면 잘 작동 sudo /usr/local/bin/a2dp-fix-wrapper하지만 udev가 시작할 때는 작동하지 않습니다. bluetoothctl실행 중인 인스턴스를 찾지 못하게 하는 일종의 env 변수임에 틀림없다고 생각합니다 bluetoothd.

누구든지 생각이 있나요?

답변1

오랜 시간이 흐른 후, 나는 이것을 다시 시도하기로 결정했고 마침내 bluetoothctl 대신 dbus를 사용하여 내가 원하는 것을 수행하게 되었습니다.

나는 작동하지 않는 몇 가지 일을 시도했습니다. 대신에 echo -e "connect $device_mac\nquit" | bluetoothctl나는 다음을 시도했다:

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

나는 또한 다음을 시도했습니다.

hcitool cc $device_mac

그리고 몇 가지 Python 스크립트도 시도했지만 궁극적으로는 dbus-send문제가 해결되었습니다.

내 스크립트는 다음과 같습니다.

/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

이제 내 블루투스 헤드셋은 항상 a2dp 싱크를 사용하여 연결됩니다. :-D

큰 감사합니다이 게시물영감을 위해.

관련 정보