다음 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
큰 감사합니다이 게시물영감을 위해.