เชื่อมต่อลำโพง Bluetooth ที่เชื่อถือได้โดยอัตโนมัติ


10

ฉันได้ทำตามบทช่วยสอนต่อไปนี้ ( http://mygeeks014.blogspot.nl/2015/01/audio-streaming-to-bluetooth-speaker.html ) เพื่อเชื่อมต่อลำโพงบลูทู ธ กับ Raspberry Pi ของฉัน ทุกอย่างทำงานได้ตามที่ควรจะเป็น แต่ลำโพงจะไม่เชื่อมต่อใหม่โดยอัตโนมัติเมื่อ Raspberry เริ่มต้นใหม่หรือลำโพงเปิด / ปิด ตอนนี้ฉันเชื่อมต่อลำโพงใหม่ด้วยตนเองผ่าน Raspbian GUI แต่ฉันสงสัยว่ามีวิธีง่ายๆในการเชื่อมต่อลำโพงผ่าน CLI อีกครั้ง ฉันจะสามารถเขียน CRON แบบง่าย ๆ เพื่อเชื่อมต่อลำโพงใหม่หากยังไม่ได้เชื่อมต่อ

คำตอบ:


17

นี่คือคำอธิบายรายละเอียดมาก:

Den3243

นี่คือโซลูชันบรรทัดคำสั่ง:

ก่อนอื่นมาสแกนจับคู่และเชื่อถืออุปกรณ์ของคุณด้วย "bluetoothctl" หากต้องการทำสิ่งนี้ให้รันสิ่งนี้ที่บรรทัดคำสั่งเทอร์มินัลของคุณ

bluetoothctl -a

คุณควรได้รับคำสั่งต่าง ๆ เช่น:

[bluetooth]

ด้วยการเปิดลำโพง BT ของคุณให้พิมพ์สิ่งนี้:

scan on

ในอีกสักครู่คุณจะเห็นอุปกรณ์ BT พร้อมใช้งาน ถัดจากอุปกรณ์จะเป็นที่อยู่ MAC เช่น: 00: AA: 22: BB: 33 ตอนนี้พิมพ์สิ่งนี้:

info <your mac address>

ยกเว้นอักขระที่มากกว่าและน้อยกว่า สิ่งที่คุณต้องการคือการเชื่อมโยงก่อนหน้ากับลำโพง BT ของคุณ คุณจะรู้ว่ามีการเชื่อมโยงก่อนหน้านี้เพราะ bluetoothctl จะแสดงข้อมูลเกี่ยวกับอุปกรณ์ BT ของคุณ ข้อมูลบางส่วนนี้จะเกี่ยวกับอุปกรณ์ที่จับคู่และเชื่อถือได้ ดีจัง.

หาก bluetoothctl บ่นเกี่ยวกับอุปกรณ์ที่ไม่มีแล้วเราต้องตั้งค่าที่ในขณะนี้ หากต้องการทำสิ่งนี้ให้พิมพ์สิ่งนี้:

pair <your mac address>

คุณควรเห็นข้อความความสำเร็จเกี่ยวกับการจับคู่อุปกรณ์ของคุณสำเร็จ ตอนนี้ขอเชื่ออุปกรณ์ BT ใหม่ของเรา พิมพ์สิ่งนี้:

trust <your mac address>

อีกครั้งคุณควรเห็นข้อความความสำเร็จเกี่ยวกับการเชื่อใจ ให้ฉันเตือนคุณล่วงหน้า อุปกรณ์ BT ของคุณอาจเชื่อมต่อจากนั้นอาจไม่ได้อีกครั้ง ไม่ต้องกลัวเราไม่ต้องการให้มันเชื่อมต่อ ไปข้างหน้าและออกจาก "bluetoothctl" หากต้องการทำเช่นนั้นให้พิมพ์:

quit

ตอนนี้คุณจะถูกนำกลับไปที่พรอมต์บรรทัดคำสั่ง ในโพสต์ก่อนหน้านี้ผมแนะนำให้คุณสร้างไดเรกทอรีสคริปต์ในไดเรกทอรีบ้านของคุณ หากคุณยังไม่มีให้ไปข้างหน้าและทำอย่างนั้นตอนนี้ พิมพ์สิ่งนี้ที่พรอมต์คำสั่ง:

mkdir -p ~/scripts

กด Enter และตอนนี้เรามาสร้างสคริปต์ bash อัตโนมัติของเรา พิมพ์สิ่งนี้:

nano ~/scripts/autopair

ใส่รหัสนี้ในสคริปต์:

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

ไม่รวมวงเล็บ!

ตอนนี้กด CTRL + x ในเวลาเดียวกันจากนั้นกด Enter เพื่อบันทึกสคริปต์ เราต้องทำให้มันใช้งานได้ หากต้องการทำสิ่งนี้ให้พิมพ์สิ่งนี้:

chmod +x ~/scripts/autopair

ฉันสมมติว่าคุณไม่ได้ใช้ลำโพงอะนาล็อกภายนอกเสียบเข้ากับแจ็ค 3.5 มม. หากเป็นจริงให้ปิดใช้งาน alsa หากต้องการทำเช่นนั้นให้แก้ไขไฟล์ในไดเรกทอรี / boot ชื่อ config.txt หากต้องการทำสิ่งนี้ให้พิมพ์สิ่งนี้ในเทอร์มินัลของคุณ:

sudo nano /boot/config.txt

เลื่อนหน้าลงไปที่ด้านล่างของไฟล์และค้นหาสองบรรทัดที่อ่าน:

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

วาง (เครื่องหมาย # # ปอนด์) ที่ด้านหน้าของบรรทัดที่อ่าน:

dtparam=audio=on

มีลักษณะดังนี้:

#dtparam=audio=on

กด CTRL + x จากนั้นกด Enter เพื่อบันทึกไฟล์ของคุณ

ฉันสมมติว่าคุณได้ติดตั้ง pulseaudio แล้วหรือยัง หากไม่ใช่ให้ดำเนินการต่อและเรียกใช้คำสั่งนี้จากบรรทัดคำสั่ง:

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

สิ่งนี้จะทำให้คุณได้รับองค์ประกอบที่สำคัญมากในการทำให้บลูทู ธ ทำงานได้! ตอนนี้เรามาแก้ไขไฟล์. bashrc ของเราในโฮมไดเร็กตอรี่ของเรา พิมพ์สิ่งนี้:

nano ~/.bashrc

เลื่อนหน้าลงไปด้านล่างและเพิ่มบรรทัดนี้:

pulseaudio --start

กด CTRL + x แล้วกด Enter เพื่อบันทึกไฟล์ของคุณ

ตกลง! เราต้องเข้าสู่โลกของงูหลาม ฉันได้เขียนโปรแกรม Python ที่จะคอยดูอุปกรณ์บลูทู ธ ในระยะสั้นมันจะเปิดใช้งานการเชื่อมต่อระหว่าง RPi และลำโพงบลูทู ธ ของคุณเมื่อเปิดลำโพงบลูทู ธ ของคุณ และในทางกลับกัน. มาสร้างไดเรกทอรีที่ชื่อ python ในโฮมไดเร็กตอรี่ของคุณโดยพิมพ์สิ่งนี้:

mkdir -p ~/python

ตอนนี้เรามาสร้างไฟล์โปรแกรมไพ ธ อน หากต้องการทำสิ่งนี้ให้พิมพ์สิ่งนี้:

nano ~/python/on.py

ภายในไฟล์นั้นเราต้องคัดลอกและวางต่อไปนี้:

#!/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()

ตอนนี้กด CTRL + x แล้วกด Enter เพื่อบันทึกไฟล์โปรแกรม Python ตอนนี้เราต้องทำให้ไฟล์นี้ทำงานได้ หากต้องการทำสิ่งนี้ให้พิมพ์สิ่งนี้:

chmod +x ~/python/on.py

สุดท้ายให้เพิ่มสิ่งนี้ลงในสคริปต์. bashrc ของเราในโฮมไดเร็กตอรี่ของเรา:

nano ~/.bashrc

เลื่อนหน้าลงไปที่ด้านล่างของไฟล์และเพิ่มสองบรรทัดนี้:

wait
~/python/on.py

ตอนนี้กด CTRL + x แล้วกด Enter เพื่อบันทึก เปิดลำโพงบลูทู ธ และรีบูต Raspberry Pi ของคุณ

โชคดี!

-nitrolinux


ขอบคุณสำหรับความคิดเห็นของคุณ ฉันต้องกดปุ่ม 'ซิงค์เสียง' ใน UI มีทางเลือก CLI สำหรับสิ่งนี้ด้วยหรือไม่
Den3243

ฉันได้อัปเดตคำตอบดั้งเดิมของฉันแล้ว
Jason Woodruff

1
ขอบคุณสำหรับคำอธิบายโดยละเอียด! ทำงานเหมือนจับใจ
Den3243

ฉันดีใจที่มันใช้งานได้!
Jason Woodruff

สคริปต์นี้จะไม่ล้มเหลวในที่สุดเนื่องจากการเรียกซ้ำไม่สิ้นสุดระหว่าง blue_it และการรอ?
เควินเฉิน

4

ฉันพบว่ามีปัญหาในปัจจุบันกับ pulseaudio5 โดยเฉพาะเมื่อพูดถึงการเล่นเสียงผ่านบลูทู ธ ดังนั้นฉันขอเสนอว่าแทนที่จะต้องแก้ไขข้อบกพร่องเหล่านั้นเมื่อพวกเขาเข้ามาใช้ PulseAudio6 ในสิ่งที่คุณต้องการ

ฉันได้สร้าง repo ที่จะทำให้ทุกอย่างด้านล่างเป็นอัตโนมัติดังนั้นคุณไม่จำเป็นต้องทำงานทั้งหมด แต่ถ้าคุณยังคงทำมันต่อไป

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

กระบวนการติดตั้ง:

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

รอจนกว่ากระบวนการติดตั้งจะเสร็จสิ้นและรีบูต เมื่อเสร็จแล้วคุณจะต้องเริ่มต้นจับคู่เชื่อถือและเชื่อมต่ออุปกรณ์ของคุณ หลังจากเวลาเริ่มต้นคุณจะต้องเปิดอุปกรณ์เท่านั้น

การจับคู่ไว้วางใจและการเชื่อมต่อ:

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

-------------------- คำแนะนำแบบสมบูรณ์: --------------------

รวบรวม PulseAudio 6

เพิ่มไฟล์ต่อไปนี้

/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

เปิดใช้งานบริการ init.d ใหม่และทำให้สามารถเรียกใช้งานได้

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

มั่นใจได้ว่าเรามีโมดูลที่จำเป็นทั้งหมด

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

เปลี่ยนเป็นไดเรกทอรีภายในบ้านและติดตั้ง json-c จากแหล่ง git (จำเป็นสำหรับ PA6)

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

เปลี่ยนเป็น Home Directory และติดตั้ง libsndfile จากซอร์ส git

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

ตรวจสอบให้แน่ใจว่ากำลังค้นหาบลูทู ธ ( sudo hciconfig hci0 piscanเลิกใช้แล้ว)

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

ไปที่ Home Directory และติดตั้ง PulseAudio 6 จากแหล่ง git

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

ตรวจสอบให้แน่ใจว่าชีพจรอยู่ในกลุ่มที่จำเป็นทั้งหมด

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

อัปเดต/etc/pulse/system.paและ/etc/pulse/daemon.confเพื่อให้มีลักษณะดังต่อไปนี้:

/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

ตั้งค่า udev Rule

แก้ไข/etc/udev/rules.d/99-com.rulesและเพิ่มสองบรรทัดต่อไปนี้:

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

สร้าง /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

ตรวจสอบให้แน่ใจว่า bluez-udev สามารถใช้งานได้

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

สรุป

เกิดอะไรขึ้นที่นี่?

  • การสร้างบริการ init.d สำหรับบลูทู ธ และ pulseaudio และเปิดใช้งานพวกเขา
  • การติดตั้งการอ้างอิงสำหรับ PulseAudio6
  • รวบรวม PulseAudio6 และเพิ่มผู้ใช้ Pulse ให้กับกลุ่มที่จำเป็น (ส่วนใหญ่จะทำไปแล้ว)
  • ติดตั้ง daemon.conf และ system.pa เพื่อโหลดโมดูลที่เหมาะสม
  • สร้างกฎ udev เพื่อเรียกใช้ bluez-udev ทุกครั้งที่มีการเชื่อมต่ออุปกรณ์ bluez-udev ตรวจสอบว่าอุปกรณ์นั้นเป็นอุปกรณ์บลูทู ธ หรือไม่หากเป็นเช่นนั้นจะพยายามเชื่อมต่อเสียงที่กำลังเล่นอยู่เข้ากับอุปกรณ์บลูทู ธ ที่สร้างโดย pulseaudio เมื่อปลดการเชื่อมต่อบลูทู ธ มันจะย้ายกระแสข้อมูลกลับไปที่อ่างเริ่มต้นหรือซิงค์ 0 ที่นั่นคุณก็มีหลังจากทั้งหมดที่คุณควรมีอุปกรณ์บลูทู ธ ที่เชื่อมต่อโดยอัตโนมัติกฎ Bluez-udev จะเชื่อมต่อเพลงที่เล่นใหม่ เชื่อมต่ออุปกรณ์บลูทู ธ แน่นอนว่าถ้าเป็น Daunting

1

คุณลองสร้าง Bash script ที่ใช้ hcitool เพื่อเชื่อมต่อหรือไม่?

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


เพิ่มสิทธิ์เรียกใช้งานลงในไฟล์นั้นจากนั้นเพิ่มลงใน cron (คุณสามารถเลือกได้ตลอดเวลา)

สิ่งนี้ใช้ได้สำหรับฉันเมื่อฉันพยายามเชื่อมต่อกับแป้นพิมพ์บลูทู ธ ฉันไม่แน่ใจว่ามันจะทำงานให้กับผู้พูดหรือไม่ (ไม่แน่ใจว่าเป็นโปรโตคอลที่ต่างออกไป) หวังว่านี่จะช่วยได้!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.