Automatycznie podłącz zaufany głośnik Bluetooth

10

Wykonałem następujący samouczek ( http://mygeeks014.blogspot.nl/2015/01/audio-streaming-to-bluetooth-speaker.html ), aby podłączyć głośnik Bluetooth do mojego Raspberry Pi. Wszystko działa tak, jak powinno, ale głośnik nie podłączy się automatycznie, gdy Raspberry zostanie ponownie uruchomiony lub głośnik zostanie włączony / wyłączony. W tej chwili ręcznie ponownie podłączam głośnik za pomocą graficznego interfejsu użytkownika Raspbian, ale zastanawiam się, czy istnieje proste rozwiązanie, aby ponownie podłączyć głośnik za pomocą interfejsu CLI. Będę wtedy mógł napisać prosty CRON, aby ponownie podłączyć głośnik, jeśli jeszcze nie jest podłączony.

Den3243
źródło

Odpowiedzi:

17

Oto bardzo szczegółowe wyjaśnienie:

Den3243

Oto rozwiązanie wiersza poleceń:

Najpierw zeskanujmy, sparujmy, zaufaj swojemu urządzeniu z „bluetoothctl”. Aby to zrobić, uruchom to w wierszu polecenia, terminal:

bluetoothctl -a

Powinieneś otrzymać inny wiersz polecenia, taki jak:

[bluetooth]

Przy włączonym głośniku BT wpisz:

scan on

Za chwilę powinieneś zobaczyć dostępne urządzenia BT. Obok urządzenia będzie jego adres MAC, na przykład: 00: AA: 22: BB: 33. Teraz wpisz to:

info <your mac address>

Wyklucz większe i mniejsze niż znaki. To, czego szukasz, to jakieś wcześniejsze skojarzenie z głośnikiem BT. Dowiesz się, że istniało poprzednie skojarzenie, ponieważ bluetoothctl wyświetli informacje o twoim urządzeniu BT. Niektóre z tych informacji dotyczą sparowania i zaufania urządzenia. To jest dobre.

Jeśli bluetoothctl narzeka, że ​​nie ma urządzenia, musimy to skonfigurować w tym momencie. Aby to zrobić, wpisz:

pair <your mac address>

Powinien zostać wyświetlony komunikat o powodzeniu powiązania urządzenia. Teraz zaufajmy naszemu nowemu urządzeniu BT. Wpisz to:

trust <your mac address>

Ponownie powinieneś zobaczyć komunikat o powodzeniu zaufania. Pozwól, że cię uprzedzę. Twoje urządzenie BT może się połączyć, a następnie może nie. Nie bój się, nie chcemy, żeby się połączyło. Śmiało, wyjdźmy z „bluetoothctl”. Aby to zrobić, wpisz:

quit

Teraz nastąpi powrót do wiersza polecenia. W poprzednim poście zasugerowałem utworzenie katalogu skryptów w katalogu domowym. Jeśli nie, zrób to teraz. Wpisz to w wierszu polecenia:

mkdir -p ~/scripts

Naciśnij Enter, a teraz stwórzmy nasz skrypt bash autopair. Wpisz to:

nano ~/scripts/autopair

Wpisz ten kod do skryptu:

#!/bin/bash
bluetoothctl << EOF
connect [enter your MAC add]
EOF

Wyklucz nawiasy!

Teraz naciśnij jednocześnie klawisze CTRL + x, a następnie naciśnij klawisz Enter, aby zapisać skrypt. Musimy sprawić, by był wykonywalny. Aby to zrobić, wpisz:

chmod +x ~/scripts/autopair

Zakładam, że nie używasz zewnętrznych głośników analogowych do gniazda 3,5 mm. Jeśli to prawda, wyłączmy alsa. Aby to zrobić, edytujmy plik w katalogu / boot o nazwie config.txt. Aby to zrobić, wpisz to w swoim terminalu:

sudo nano /boot/config.txt

Przewiń do dołu pliku i poszukaj dwóch wierszy:

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

Umieść (znak funta #) przed wierszem o treści:

dtparam=audio=on

Wygladać jak:

#dtparam=audio=on

Naciśnij klawisze CTRL + x, a następnie naciśnij klawisz Enter, aby zapisać plik.

Zakładam, że masz zainstalowany pulseaudio? Jeśli nie, śmiało i uruchom to polecenie z wiersza poleceń:

sudo apt-get update && sudo apt-get install pulseaudio -y

Dzięki temu otrzymasz bardzo ważny komponent do działania bluetooth! Teraz edytujmy nasz plik .bashrc w naszym katalogu domowym. Wpisz to:

nano ~/.bashrc

Przewiń w dół i dodaj ten wiersz:

pulseaudio --start

Naciśnij CTRL + x, a teraz naciśnij Enter, aby zapisać plik.

OK! Musimy wejść w świat Pythona. Napisałem program w języku Python, który będzie obserwował urządzenie Bluetooth. Krótko mówiąc, aktywuje połączenie między RPi a głośnikiem bluetooth, gdy głośnik bluetooth zostanie włączony. I wzajemnie. Utwórzmy katalog o nazwie python w katalogu domowym Aby to zrobić, wpisz:

mkdir -p ~/python

Teraz stwórzmy plik programu python. Aby to zrobić, wpisz:

nano ~/python/on.py

Wewnątrz tego pliku musimy skopiować i wkleić następujące elementy:

#!/usr/bin/python
#
# Monitor removal of bluetooth reciever
import os
import sys
import subprocess
import time

def blue_it():
    status = subprocess.call('ls /dev/input/event0 2>/dev/null', shell=True)
    while status == 0:
        print("Bluetooth UP")
        print(status)
        time.sleep(15)
        status = subprocess.call('ls /dev/input/event0 2>/dev/null', shell=True)
    else:
        waiting()

def waiting():
    subprocess.call('killall -9 pulseaudio', shell=True)
    time.sleep(3)
    subprocess.call('pulseaudio --start', shell=True)
    time.sleep(2)
    status = subprocess.call('ls /dev/input/event0 2>/dev/null', shell=True)  
    while status == 2:
        print("Bluetooth DOWN")
        print(status)
        subprocess.call('~/scripts/autopair', shell=True)
        time.sleep(15)
        status = subprocess.call('ls /dev/input/event0 2>/dev/null', shell=True)
    else:
        blue_it() 

blue_it()

Teraz naciśnij CTRL + x, a następnie naciśnij Enter, aby zapisać plik programu Python. Teraz musimy uczynić ten plik wykonywalnym. Aby to zrobić, wpisz:

chmod +x ~/python/on.py

Na koniec dodajmy to do naszego skryptu .bashrc w naszym katalogu domowym:

nano ~/.bashrc

Przewiń do dołu pliku i dodaj te dwa wiersze:

wait
~/python/on.py

Teraz naciśnij CTRL + x, a następnie naciśnij Enter, aby zapisać. Włącz głośnik bluetooth i uruchom ponownie Raspberry Pi.

Powodzenia!

-nitrolinux

Jason Woodruff
źródło
Dzięki za komentarz. Muszę także nacisnąć przycisk „Sink Audio” w interfejsie użytkownika, czy istnieje również alternatywa CLI?
Den3243,
Zaktualizowałem swoją pierwotną odpowiedź.
Jason Woodruff,
1
Dziękujemy za bardzo szczegółowe wyjaśnienie! Działa jak marzenie.
Den3243,
Cieszę się, że zadziałało!
Jason Woodruff
czy ten skrypt w końcu się nie zawiesi z powodu nieskończonej rekurencji między blue_it a oczekiwaniem?
Kevin Chen
4

Odkryłem, że istnieją aktualne problemy z pulseaudio5, szczególnie jeśli chodzi o odtwarzanie dźwięku przez bluetooth. Jako taki proponuję, aby zamiast debugować te, kiedy się pojawią, wystarczy użyć PulseAudio6 do tego, czego chcesz.

Stworzyłem repozytorium, które zautomatyzuje wszystko poniżej, więc nie musisz wykonywać całej pracy nóg, ale jeśli nadal chcesz to zrobić sam, kontynuuj poniżej.

Repo: https://github.com/BaReinhard/a2dp_bluetooth

Proces instalacji:

git clone https://github.com/bareinhard/a2dp_bluetooth
cd a2dp_bluetooth/a2dp_source
./configure

Poczekaj na zakończenie procesu instalacji i uruchom ponownie. Po zakończeniu musisz najpierw sparować, zaufać i podłączyć urządzenie. Po początkowym czasie wystarczy tylko włączyć urządzenie.

Parowanie, zaufanie i łączenie:

sudo bluetoothctl
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on
[bluetooth]# pair XX:XX:XX:XX:XX
[bluetooth]# trust XX:XX:XX:XX:XX
[bluetooth]# connect XX:XX:XX:XX:XX
[bluetooth]# exit

-------------------- Pełny przewodnik: --------------------

Kompilowanie PulseAudio 6

Dodaj następujące pliki

/etc/init.d/pulseaudio

#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          pulseaudio esound
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      udev network-manager
# Should-Stop:       udev network-manager
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start the PulseAudio sound server
# Description:       System mode startup script for
#                    the PulseAudio sound server.
### END INIT INFO

DAEMON=/usr/local/bin/pulseaudio
PIDDIR=/var/run/pulse
PIDFILE=$PIDDIR/pid
DAEMONUSER=pulse
PATH=/sbin:/bin:/usr/sbin:/usr/bin

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

pulseaudio_start () {
        log_daemon_msg "Starting system PulseAudio Daemon"
        if [ ! -d $PIDDIR ]; then
                mkdir -p $PIDDIR
                chown $DAEMONUSER:$DAEMONUSER $PIDDIR
        fi
        start-stop-daemon -x $DAEMON -p $PIDFILE --start -- --system --disallow-exit --disallow-module-loading=0 --daemonize --log-target=syslog --high-priority
        status=$?
        if [ -e /var/run/pulse/.esd_auth ]; then
                chown pulse:pulse-access /var/run/pulse/.esd_auth
                chmod 640 /var/run/pulse/.esd_auth
        fi
        if [ -e /var/run/pulse/.pulse-cookie ]; then
                chown pulse:pulse-access /var/run/pulse/.pulse-cookie
                chmod 640 /var/run/pulse/.pulse-cookie
        fi
        log_end_msg ${status}
}

pulseaudio_stop () {
        log_daemon_msg "Stopping system PulseAudio Daemon"
        start-stop-daemon -p $PIDFILE --stop --retry 5 || echo -n "...which is not running"
        log_end_msg $?
}

case "$1" in
        start|stop)
                pulseaudio_${1}
                ;;
        restart|reload|force-reload)
                if [ -s $PIDFILE ] && kill -0 $(cat $PIDFILE) >/dev/null 2>&1; then
                        pulseaudio_stop
                        pulseaudio_start
                fi
                ;;
        force-stop)
                pulseaudio_stop
                killall pulseaudio || true
                sleep 2
                killall -9 pulseaudio || true
                ;;
        status)
                status_of_proc -p $PIDFILE "$DAEMON" "system-wide PulseAudio" && exit 0 || exit $?
                ;;
        *)
                echo "Usage: /etc/init.d/pulseaudio {start|stop|force-stop|restart|reload|force-reload|status}"
                exit 1
                ;;
esac

exit 0

/etc/init.d/bluetooth

#!/bin/sh -e
### BEGIN INIT INFO
# Provides:            bluetooth
# Required-Start:      $local_fs $syslog dbus
# Required-Stop:       $local_fs $syslog
# Default-Start:       2 3 4 5
# Default-Stop:        0 1 6
# Short-Description:   Starts bluetooth daemons
### END INIT INFO

. /lib/lsb/init-functions

DESC=bluetoothd
DAEMON=/usr/libexec/bluetooth/bluetoothd
#SSD_OPTIONS="--oknodo --quiet --exec $DAEMON --plugin=a2dp"
SSD_OPTIONS="--oknodo --quiet --exec $DAEMON" #Change to this if you want media control using DBus at the expense of volume control 
HCI=hci0

case "${1}" in
    start)
       log_daemon_msg "Starting Bluetooth daemon bluetoothd..."
       start-stop-daemon --start --background $SSD_OPTIONS
       log_progress_msg "${DAEMON}"

       hciconfig $HCI up > /dev/null 2>&1
       log_end_msg 0
       ;;

    stop)
        log_daemon_msg "Stopping Bluetooth daemon bluetoothd..."
        start-stop-daemon --stop $SSD_OPTIONS
        log_progress_msg "${DAEMON}"
        log_end_msg 0
       ;;

    restart)
       ${0} stop
       sleep 1
       ${0} start
       ;;

    status)
        status_of_proc "$DAEMON" "$DESC" && exit 0 || exit $?
       ;;

    *)
         echo "Usage: ${0} {start|stop|restart|status}"
         exit 1
       ;;
esac

exit 0

Włącz nowe usługi init.d i uczyń pliki wykonywalne

sudo chmod +x /etc/init.d/bluetooth
sudo chmod +x /etc/init.d/pulseaudio
sudo update-rc.d bluetooth defaults
sudo update-rc.d pulseaudio defaults

Upewnij się, że mamy wszystkie niezbędne moduły

sudo apt-get install bluez pulseaudio-module-bluetooth python-dbus libtool intltool libsndfile-dev libcap-dev libjson0-dev libasound2-dev libavahi-client-dev libbluetooth-dev libglib2.0-dev libsamplerate0-dev libsbc-dev libspeexdsp-dev libssl-dev libtdb-dev libbluetooth-dev intltool autoconf autogen automake build-essential libasound2-dev libflac-dev libogg-dev libtool libvorbis-dev pkg-config python -y

Przejdź do katalogu domowego i zainstaluj json-c ze źródła git (wymagane dla PA6)

cd ~
git clone https://github.com/json-c/json-c.git
cd json-c
./configure 
make
sudo make install

Przejdź do katalogu domowego i zainstaluj plik libsndfile ze źródła git

git clone git://github.com/erikd/libsndfile.git
cd libsndfile
./autogen.sh
./configure --enable-werror
make
sudo make install

Upewnij się, że wyszukiwarka Bluetooth wyszukuje ( sudo hciconfig hci0 piscanjest przestarzała)

cat << EOT | sudo tee -a /etc/bluetooth/main.conf
[Policy]
AutoEnable=true
EOT

Przejdź do katalogu domowego i zainstaluj PulseAudio 6 ze źródła git

git clone --branch v6.0 https://github.com/pulseaudio/pulseaudio
cd pulseaudio
sudo ./bootstrap.sh
sudo make
sudo make install
sudo ldconfig

Upewnij się, że puls znajduje się we wszystkich niezbędnych grupach

sudo addgroup --system pulse
sudo adduser --system --ingroup pulse --home /var/run/pulse pulse
sudo addgroup --system pulse-access
sudo adduser pulse audio
sudo adduser root pulse-access
sudo adduser pulse lp

Zaktualizuj /etc/pulse/system.pai /etc/pulse/daemon.confwygląda następująco:

/etc/pulse/system.pa

#!/usr/bin/pulseaudio -nF
#
# This file is part of PulseAudio.
#
# PulseAudio is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# PulseAudio is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with PulseAudio; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.

# This startup script is used only if PulseAudio is started in system
# mode.

### Automatically load driver modules depending on the hardware available
.ifexists module-udev-detect.so
 #load-module module-udev-detect
 load-module module-udev-detect tsched=0
.else
### Use the static hardware detection module (for systems that lack udev/hal support)
load-module module-detect
.endif

### Load several protocols
.ifexists module-esound-protocol-unix.so
load-module module-esound-protocol-unix
.endif
load-module module-native-protocol-unix

### Automatically restore the volume of streams and devices
load-module module-stream-restore
load-module module-device-restore

### Automatically restore the default sink/source when changed by the user
### during runtime
### NOTE: This should be loaded as early as possible so that subsequent modules
### that look up the default sink/source get the right value
load-module module-default-device-restore

### Automatically move streams to the default sink if the sink they are
### connected to dies, similar for sources
load-module module-rescue-streams

### Make sure we always have a sink around, even if it is a null sink.
load-module module-always-sink

### Automatically suspend sinks/sources that become idle for too long
load-module module-suspend-on-idle

### Enable positioned event sounds
load-module module-position-event-sounds

### Automatically load driver modules for Bluetooth hardware
.ifexists module-bluetooth-discover.so
    load-module module-bluetooth-discover
.endif
load-module module-bluetooth-policy
load-module module-switch-on-connect

/etc/pulse/daemon.conf

# This file is part of PulseAudio.
#
# PulseAudio is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# PulseAudio is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with PulseAudio; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA.

## Configuration file for the PulseAudio daemon. See pulse-daemon.conf(5) for
## more information. Default values are commented out.  Use either ; or # for
## commenting.

; daemonize = no
; fail = yes
; allow-module-loading = yes
; allow-exit = yes
; use-pid-file = yes
; system-instance = no
; local-server-type = user
; enable-shm = yes
; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB
; lock-memory = no
; cpu-limit = no

; high-priority = yes
; nice-level = -15

; realtime-scheduling = yes
; realtime-priority = 5

exit-idle-time = -1
; scache-idle-time = 20

; dl-search-path = (depends on architecture)

; load-default-script-file = yes
; default-script-file = /etc/pulse/default.pa

; log-target = auto
; log-level = notice
; log-meta = no
; log-time = no
; log-backtrace = 0

# resample-method defaults to  speex-float-1 on most architectures,
# speex-fixed-1 on ARM
; resample-method = speex-float-1
resample-method = ffmpeg
enable-remixing = no
enable-lfe-remixing = no

; flat-volumes = yes

; rlimit-fsize = -1
; rlimit-data = -1
; rlimit-stack = -1
; rlimit-core = -1
; rlimit-as = -1
; rlimit-rss = -1
; rlimit-nproc = -1
; rlimit-nofile = 256
; rlimit-memlock = -1
; rlimit-locks = -1
; rlimit-sigpending = -1
; rlimit-msgqueue = -1
; rlimit-nice = 31
; rlimit-rtprio = 9
; rlimit-rttime = 1000000

default-sample-format = s16le
default-sample-rate = 44100
;alternate-sample-rate = 48000
default-sample-channels = 2
; default-channel-map = front-left,front-right

default-fragments = 10
default-fragment-size-msec = 10

; enable-deferred-volume = yes
; deferred-volume-safety-margin-usec = 8000
; deferred-volume-extra-delay-usec = 0

Skonfiguruj regułę udev

Edytuj /etc/udev/rules.d/99-com.rulesi dodaj następujące dwa wiersze:

SUBSYSTEM=="input", GROUP="input", MODE="0660"
KERNEL=="input[0-9]*", RUN+="/usr/local/bin/bluez-udev"

Stwórz /usr/local/bin/bluez-udev

/ usr / local / bin / bluez-udev

#!/bin/bash
name=$(sed 's/\"//g' <<< $NAME)
#exit if not a BT address
if [[ ! $name =~ ^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$ ]]; then exit 0;  fi

bt_name=`grep Name /var/lib/bluetooth/*/$name/info | awk -F'=' '{print $2}'`

audio_sink=bluez_source.$(sed 's/:/_/g' <<< $name)

action=$(expr "$ACTION" : "\([a-zA-Z]\+\).*")
logger "Action: $action"
if [ "$action" = "add" ]; then
    logger "[$(basename $0)] Bluetooth device is being added [$name] - $bt_name"
    logger "[$(basename $0)] Patching $audio_source into ALSA sink #$audio_sink"
    #hciconfig hci0 noscan
    bluetoothctl << EOT
discoverable off
EOT
    # Grab Card Number
    PACARD=`pactl list cards | grep "Card #" | sed "s/Card #//"`

    # Grab Sink Input if it exists
    audio_source=`pactl pactl list sink-inputs | grep "Sink Input" | sed "s/Sink Input #//"`
    if [ $audio_source = "" ];then
        sleep 5
        audio_source=`pactl pactl list sink-inputs | grep "Sink Input" | sed "s/Sink Input #//"`

    fi
    pactl set-sink-volume $audio_sink 65537
    if [ $audio_source != "" ]; then
        pactl set-source-volume $audio_source 90%
    fi
    pactl set-card-profile $PACARD a2dp_sink


    pactl set-default-sink $audio_sink





    # loop back this source to the default sink
    handle=$(pactl load-module module-loopback source=$audio_source sink=$audio_sink)
    logger "[$(basename $0)] PulseAudio module-loopback returned handle [$handle]"
    logger "$bt_name"


fi

if [ "$action" = "remove" ]; then
    # Grab Sink Input if it exists
    audio_source=`pactl pactl list sink-inputs | grep "Sink Input" | sed "s/Sink Input #//"`
    if [ $audio_source = "" ];then
        sleep 5
        audio_source=`pactl pactl list sink-inputs | grep "Sink Input" | sed "s/Sink Input #//"`

    fi
    pactl set-sink-volume 0 65537
    if [ $audio_source = "" ]; then
#        pactl set-default-sink 0
        pactl set-source-volume $audio_source 90%
    else
        pactl move-sink-input $audio_source 0 
    fi

    logger "[$(basename $0)] Bluetooth device is being removed [$name] - $bt_name"
    #hciconfig hci0 pscan

    bluetoothctl << EOT
discoverable on
EOT

    # remove any loopback modules assigned to this source
    # only required for USB sound cards, which PulseAudio will not automatically remove
    for handle in $(pactl list short modules | grep module-loopback | grep source=$audio_source | cut -f 1); do
        logger "[$(basename $0)] Unloading module-loopback with handle [$handle]"
        pactl unload-module $handle
    done

    sleep 5
    amixer cset numid=3 80%
    amixer cset numid=3 80%
fi

Upewnij się, że bluez-udev jest wykonywalny

sudo chmod +x /usr/local/bin/bluez-udev

Podsumowanie

Co się tutaj robi?

  • Tworzenie usług init.d dla bluetooth i pulseaudio i włączanie ich
  • Instalowanie zależności dla PulseAudio6
  • Kompilowanie PulseAudio6 i dodawanie użytkownika pulsu do niezbędnych grup (większość już została wykonana)
  • Skonfiguruj daemon.conf i system.pa, aby załadować odpowiednie moduły
  • Utwórz regułę udev, aby uruchamiać bluez-udev przy każdym podłączeniu urządzenia. bluez-udev sprawdza, czy urządzenie jest urządzeniem bluetooth, jeśli tak, spróbuje podłączyć bieżący odtwarzany dźwięk do zlewu urządzenia bluetooth utworzonego przez pulseaudio. Po rozłączeniu Bluetooth przeniesie strumień z powrotem do domyślnego zlewu lub zlewu 0. Tutaj masz, w końcu powinieneś mieć automatycznie podłączone urządzenie Bluetooth, reguła bluez-udev automatycznie połączy odtwarzaną muzykę z nowo podłączone urządzenie bluetooth. Oczywiście, jeśli wydaje się to zniechęcające
Brett Reinhard
źródło
1

Czy próbowałeś utworzyć skrypt Bash, który używa hcitool do łączenia?

#!/bin/bash
sudo hcitool cc [speaker Bluetooth address]


Dodaj prawa do pliku wykonywalnego, a następnie dodaj go do crona (możesz wybrać w dowolnym momencie).

Działa to dla mnie, gdy próbowałem połączyć się z klawiaturą Bluetooth. Nie jestem pewien, czy to zadziała dla głośnika (nie jestem pewien, czy to inny protokół). Mam nadzieję że to pomoże!

ALinuxLover
źródło
0

znalazłem to jeszcze lepiej

sudo bluetoothctl <<EOF
power on
discoverable on
pairable on
agent NoInputNoOutput
default-agent 
EOF
Jochnickel
źródło