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

經過對環境變數的大量幹預後,我讓這些pacmd東西可以工作了。然而,現在該bluetoothctl部分掛起“Waiting to connect to bluetoothd…”。如果我從 shell 手動呼叫它,則效果很好,sudo /usr/local/bin/a2dp-fix-wrapper但當 udev 啟動它時則不行。我想它一定是某種環境變量,阻止bluetoothctl找到正在運行的bluetoothd實例。

有人有什麼想法嗎?

答案1

很長一段時間後,我決定再試一次,終於讓它用 dbus 而不是 bluetoothctl 來做我想做的事情。

我嘗試了一些不起作用的事情。而不是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

非常感謝這個帖子為了靈感。

相關內容