树莓派连接天猫精灵音箱通过蓝牙播放音乐的方法

使用bluealsa通过命令行指定某个蓝牙音箱播放

安装bluealsa有两种方法,第一种是通过apt安装,第二种是通过源码安装。

1. 通过apt安装bluealsa

1.1 安装并启动bluealsa服务

sudo apt-get install bluealsa
sudo service bluealsa start

1.2 将pi加入对应用户组

sudo adduser pi bluetooth
sudo adduser pi audio

1.3 修改/lib/systemd/system/bluetooth.service

sudo nano /lib/systemd/system/bluetooth.service

ExecStart=/usr/lib/bluetooth/bluetoothd修改为ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=sap --plugin=a2dp
文件最后添加(似乎不加也行)

[Install]
WantedBy=bluetooth.target
Alias=dbus-org.bluez.service

1.4 重启服务

sudo systemctl daemon-reload
sudo systemctl restart bluetooth

1.5 连接蓝牙音箱

sudo bluetoothctl

然后依次输入power onscan on:

[bluetooth]# power on
Changing power on succeeded
[bluetooth]# scan on
Discovery started
[CHG] Controller xx:xx:xx:xx:5F:11 Discovering: yes
[NEW] Device XX:XX:XX:5A:19:8A xx-xx-xx-5A-19-8A
[NEW] Device XX:XX:XX:84:81:86 xx-xx-xx-84-81-86
[NEW] Device XX:XX:XX:48:0D xx-xx-xx-8A-48-0D
[NEW] Device XX:XX:XX:85:84:9E LYWSD03MMC
[NEW] Device XX:XX:XX:DD:21:84 LYWSD03MMC
[CHG] Device XX:XX:XX:30:CB:5C RSSI: -65
[CHG] Device XX:XX:XX:84:81:86 RSSI: -45
[CHG] Device XX:XX:XX:84:81:86 ManufacturerData Key: 0x004c
[CHG] Device XX:XX:XX:84:81:86 ManufacturerData Value:
  xx xx xx 59 75 0d de c3 15 f6 85 e9 c7  .....`Yu........
[CHG] Device XX:XX:XX:DD:21:84 RSSI: -77
[CHG] Device XX:XX:XX:84:81:86 RSSI: -54
[CHG] Device XX:XX:XX:DD:21:84 RSSI: -87

输入devices查看设备列表

[bluetooth]# devices
Device XX:XX:XX:DD:21:84 LYWSD03MMC
Device XX:XX:XX:85:84:9E LYWSD03MMC
Device XX:XX:XX:8A:48:0D xx-xx-xx-8A-48-0D
Device XX:XX:XX:84:81:86 xx-xx-xx-84-81-86
Device XX:XX:XX:5A:19:8A xx-xx-xx-5A-19-8A
Device XX:XX:XX:30:CB:5C 方糖(6C:7C)

我要连接我的天猫精灵方糖(列表中的方糖(6C:7C)XX:XX:XX:30:CB:5C是它的mac地址)。首次连接,需要pairtrust(trust之后下次会自动连接),如果你的天猫精灵不在列表里,那就语音唤醒天猫精灵并说“打开蓝牙”,然后重新scan on一次。

pair XX:XX:XX:30:CB:5C
trust XX:XX:XX:30:CB:5C

首次pair可能需要手动输入yes确认。

[bluetooth]# pair XX:XX:XX:30:CB:5C
Attempting to pair with XX:XX:XX:30:CB:5C
[CHG] Device XX:XX:XX:30:CB:5C Connected: yes
Request confirmation
[agent] Confirm passkey 529316 (yes/no): yes
[CHG] Device XX:XX:XX:30:CB:5C Modalias: bluetooth:v000Fp1200d1436
[CHG] Device XX:XX:XX:30:CB:5C UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:30:CB:5C UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:30:CB:5C UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:30:CB:5C UUIDs: 00001200-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:30:CB:5C UUIDs: 00001800-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:30:CB:5C UUIDs: 00001801-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:30:CB:5C ServicesResolved: yes
[CHG] Device XX:XX:XX:30:CB:5C Paired: yes
Pairing successful
[CHG] Device XX:XX:XX:30:CB:5C ServicesResolved: no
[CHG] Device XX:XX:XX:30:CB:5C Connected: no

[bluetooth]# trust XX:XX:XX:30:CB:5C
[CHG] Device XX:XX:XX:30:CB:5C Trusted: yes
Changing XX:XX:XX:30:CB:5C trust succeeded

我要连接我的天猫精灵方糖,使用connect命令即可:

connect XX:XX:XX:30:CB:5C

连接成功后前面的提示符会从[bluetooth]变成设备名(本例为[方糖(6C:7C)]):

[bluetooth]# connect XX:XX:XX:30:CB:5C
Attempting to connect to XX:XX:XX:30:CB:5C
[CHG] Device XX:XX:XX:30:CB:5C Connected: yes
Connection successful
[CHG] Device XX:XX:XX:30:CB:5C ServicesResolved: yes
[方糖(6C:7C)]#

1.6 播放wav音频

连接成功以后exit退出,就可以使用aplay命令通过该设备播放音频了:

aplay -D bluealsa:DEV=XX:XX:XX:30:CB:5C,PROFILE=a2dp ./cat1.wav
$ aplay -D bluealsa:DEV=XX:XX:XX:30:CB:5C,PROFILE=a2dp ./cat1.wav
D: ../../../src/asound/bluealsa-pcm.c:1309: Getting BlueALSA PCM: PLAYBACK XX:XX:XX:30:CB:5C a2dp
D: ../../../src/asound/bluealsa-pcm.c:1062: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: Setting constraints
Playing WAVE './cat1.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
D: ../../../src/asound/bluealsa-pcm.c:532: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: Initializing HW
D: ../../../src/asound/bluealsa-pcm.c:567: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: FIFO buffer size: 1024 frames
D: ../../../src/asound/bluealsa-pcm.c:576: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: Selected HW buffer: 4 periods x 24000 bytes == 96000 bytes
D: ../../../src/asound/bluealsa-pcm.c:600: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: Initializing SW
D: ../../../src/asound/bluealsa-pcm.c:600: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: Initializing SW
D: ../../../src/asound/bluealsa-pcm.c:600: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: Initializing SW
D: ../../../src/asound/bluealsa-pcm.c:600: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: Initializing SW
D: ../../../src/asound/bluealsa-pcm.c:639: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: Prepared
D: ../../../src/asound/bluealsa-pcm.c:600: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: Initializing SW
D: ../../../src/asound/bluealsa-pcm.c:356: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: Starting
D: ../../../src/asound/bluealsa-pcm.c:226: /org/bluealsa/hci0/dev_xx_xx_xx_30_CB_5C/a2dpsrc/sink: Starting IO loop: 8
D: ../../../src/asound/bluealsa-pcm.c:600: /org/bluealsa/hci0/dev_10_9E_3A_30_CB_5C/a2dpsrc/sink: Initializing SW
D: ../../../src/asound/bluealsa-pcm.c:607: /org/bluealsa/hci0/dev_10_9E_3A_30_CB_5C/a2dpsrc/sink: Changing SW avail min: 6000 -> 1
D: ../../../src/asound/bluealsa-pcm.c:600: /org/bluealsa/hci0/dev_10_9E_3A_30_CB_5C/a2dpsrc/sink: Initializing SW
D: ../../../src/asound/bluealsa-pcm.c:607: /org/bluealsa/hci0/dev_10_9E_3A_30_CB_5C/a2dpsrc/sink: Changing SW avail min: 1 -> 6000
D: ../../../src/asound/bluealsa-pcm.c:231: /org/bluealsa/hci0/dev_10_9E_3A_30_CB_5C/a2dpsrc/sink: Pausing IO thread
D: ../../../src/asound/bluealsa-pcm.c:392: /org/bluealsa/hci0/dev_10_9E_3A_30_CB_5C/a2dpsrc/sink: Stopping
D: ../../../src/asound/bluealsa-pcm.c:161: /org/bluealsa/hci0/dev_10_9E_3A_30_CB_5C/a2dpsrc/sink: IO thread cleanup
D: ../../../src/asound/bluealsa-pcm.c:392: /org/bluealsa/hci0/dev_10_9E_3A_30_CB_5C/a2dpsrc/sink: Stopping
D: ../../../src/asound/bluealsa-pcm.c:592: /org/bluealsa/hci0/dev_10_9E_3A_30_CB_5C/a2dpsrc/sink: Freeing HW
D: ../../../src/asound/bluealsa-pcm.c:443: /org/bluealsa/hci0/dev_10_9E_3A_30_CB_5C/a2dpsrc/sink: Closing

但是通过-D bluealsa:DEV=10:9E:3A:30:CB:5C来每次指定设备,还要通过PROFILE=a2dp指定profile很麻烦,我们可以设置指定默认的播放设备和profile。编辑用户配置文件~/.asoundrc即可。

nano ~/.asoundrc

内容改为:

pcm.!default {
        type plug
        slave.pcm {
                type bluealsa
                device "XX:XX:XX:30:CB:5C"
                profile "a2dp"
        }
}
pcm.fangtang {
        type plug
        slave.pcm {
                type bluealsa
                device "XX:XX:XX:30:CB:5C"
                profile "a2dp"
        }
}

注:还有一个全局配置文件/etc/asound.conf

1.7 播放MP3格式音频

aplay无法播放MP3格式的音频,我们需要mplayer

sudo apt install mplayer
mplayer cat.mp3
#或者使用alsa默认设备
mplayer -ao alsa cat.mp3
#或者指定设备
mplayer -ao alsa:device=fangtang cat.mp3

1.8 你可能需要的一些对debug有用的命令

1.8.1 bluealsa相关
bluealsa-aplay --list-pcms
bluealsa-aplay --list-devices
bluealsa-aplay -L
1.8.2 bluetoothctl相关

list: 列出所有接口。 使用 select XX:XX:XX... 选择其他接口。
devices :列出所有设备. 使用 scan on, scan off 查找新设备。
info XX:XX:XX... : 显示指定设备的信息。
remove XX:XX:XX... :移除指定设备。当设备出现问题时,可以通过这种方式调试。
connect XX:XX:XX...: 连接指定设备。
disconnect XX:XX:XX...: 断开指定设备。
pair XX:XX:XX...: 配对指定设备。
trust XX:XX:XX...: 信任指定设备。
power on: 打开bluetooth电源。
scan on: 开始扫描设备。
agent NoInputNoOutput : 使用这种模式作为蓝牙sink可以无需介入直接连接。
default-agent : 将当前agent模式作为默认。
discoverable on :将当前设备转为可发现状态。

这些命令可以在sudo bluetoothctl之后在[bluetooth]提示符内运行,或者直接在系统命令行运行bluetoothctl 命令,例如bluetoothctl info, bluetoothctl connect XX:XX:XX...
例如:

pi@raspberrypi:~ $ bluetoothctl info
Device XX:XX:XX:30:CB:5C (public)
	Name: 方糖(6C:7C)
	Alias: 方糖(6C:7C)
	Class: 0x002c0414
	Icon: audio-card
	Paired: yes
	Trusted: yes
	Blocked: no
	Connected: yes
	LegacyPairing: no
	UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
	UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
	UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
	UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
	UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
	UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
	Modalias: bluetooth:v000Fp1200d1436
1.8.3 其它

busctl tree org.bluez - 查看连接的设备

pi@raspberrypi:~/sound $ bluealsa-aplay --list-pcms
bluealsa:SRV=org.bluealsa,DEV=XX:XX:XX:30:CB:5C,PROFILE=a2dp
    方糖(6C:7C), trusted audio-card, playback
    A2DP (SBC): S16_LE 2 channels 48000 Hz

查看相关日志:

dmesg | egrep -i 'blue|firm'
tail -f /var/log/syslog
journalctl -u bluetooth
journalctl | grep blue

service bluetooth status 或者 sudo systemctl status bluetooth查看服务状态

pi@raspberrypi:~ $ service bluetooth status
● bluetooth.service - Bluetooth service
   Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2022-06-15 09:48:02 CST; 5h 2min ago
     Docs: man:bluetoothd(8)
 Main PID: 386 (bluetoothd)
   Status: "Running"
    Tasks: 1 (limit: 725)
   CGroup: /system.slice/bluetooth.service
           └─386 /usr/lib/bluetooth/bluetoothd --noplugin=sap --plugin=a2dp

615 09:48:02 raspberrypi bluetoothd[386]: Ignoring (cli) battery
615 09:48:02 raspberrypi bluetoothd[386]: Ignoring (cli) sixaxis
615 09:48:02 raspberrypi bluetoothd[386]: Bluetooth management interface 1.18 initialized
615 09:48:02 raspberrypi bluetoothd[386]: Failed to set privacy: Rejected (0x0b)
615 09:48:02 raspberrypi bluetoothd[386]: Endpoint registered: sender=:1.2 path=/org/bluez/hci0/A2DP/AAC/source/1
615 09:48:02 raspberrypi bluetoothd[386]: Endpoint registered: sender=:1.2 path=/org/bluez/hci0/A2DP/AAC/source/2
615 09:48:02 raspberrypi bluetoothd[386]: Endpoint registered: sender=:1.2 path=/org/bluez/hci0/A2DP/SBC/source/1
615 09:48:02 raspberrypi bluetoothd[386]: Endpoint registered: sender=:1.2 path=/org/bluez/hci0/A2DP/SBC/source/2
615 11:16:10 raspberrypi bluetoothd[386]: /org/bluez/hci0/dev_10_9E_3A_30_CB_5C/fd0: fd(17) ready
615 12:41:37 raspberrypi bluetoothd[386]: /org/bluez/hci0/dev_10_9E_3A_30_CB_5C/fd1: fd(17) ready

注:Failed to set privacy: Rejected (0x0b)不影响播放。

Couldn't get BlueALSA PCM: PCM not found错误

ALSA lib ../../../src/asound/bluealsa-pcm.c:1313:(_snd_pcm_bluealsa_open) Couldn't get BlueALSA PCM: PCM not found
aplay: main:828: audio open error: 没有那个设备

原因:通常是因为设备没有连接。只要配对并连接上设备,就OK了。

========= 以下内容较为复杂,供参考 ===========

2. 通过源码安装bluealsa

2.1 下载bluealsa源码

git clone https://github.com/Arkq/bluez-alsa.git

2.2 安装必要依赖

sudo apt update
sudo apt install git automake autoconf build-essential libtool pkg-config python-docutils
sudo apt install bluez bluez-tools libasound2-dev libbluetooth-dev libdbus-1-dev libglib2.0-dev libsbc-dev

2.3 编译安装

cd bluez-alsa
autoreconf --install --force
mkdir build && cd build
# 以下configure命令二选一
#../configure --enable-aac --enable-ofono --enable-debug
../configure CFLAGS="-g -O0" LDFLAGS="-g" --enable-debug
make && sudo make install

如果configure里面使用了--enable-aac选项,那么需要先编译安装fdk-aac,否则会报错:

cd ~
git clone --depth 1 https://github.com/mstorsjo/fdk-aac
cd fdk-aac \
&& autoreconf -fiv \
&& ./configure \
&& make -j$(nproc) \
&& sudo make install

2.4 运行Bluealsa

$ sudo bluealsa -i hci0 -p a2dp-source
#如果编译安装正确,sudo bluealsa -S 之后会出现如下信息
bluealsa: D: ../../src/main.c:580: Starting main dispatching loop
bluealsa: D: ../../src/main.c:112: Acquired D-Bus service name: org.bluealsa
bluealsa: D: ../../src/bluealsa-dbus.c:426: Registering D-Bus manager: /org/bluealsa
bluealsa: D: ../../src/bluez.c:679: Registering battery provider: /org/bluez/hci0/battery
bluealsa: D: ../../src/bluez.c:699: BlueZ battery provider support not available
bluealsa: D: ../../src/bluez.c:493: Creating media endpoint object: /org/bluez/hci0/A2DP/SBC/source/1
bluealsa: D: ../../src/bluez.c:402: Registering media endpoint: /org/bluez/hci0/A2DP/SBC/source/1
bluealsa: D: ../../src/bluez.c:493: Creating media endpoint object: /org/bluez/hci0/A2DP/SBC/source/2
bluealsa: D: ../../src/bluez.c:402: Registering media endpoint: /org/bluez/hci0/A2DP/SBC/source/2
bluealsa: D: ../../src/bluez.c:928: Creating hands-free profile object: /org/bluez/HSP/AudioGateway
bluealsa: D: ../../src/bluez.c:852: Registering hands-free profile: /org/bluez/HSP/AudioGateway
bluealsa: D: ../../src/bluez.c:928: Creating hands-free profile object: /org/bluez/HFP/AudioGateway
bluealsa: D: ../../src/bluez.c:852: Registering hands-free profile: /org/bluez/HFP/AudioGateway

2.5 将pi加入对应用户组

sudo adduser pi bluetooth
sudo adduser pi audio

2.6 将bluealsa加入开机启动

编辑开机启动文件:

sudo nano /etc/rc.local

exit行之前加入如下内容

# Start bluealsa as root <https://github.com/Arkq/bluez-alsa>
export LIBASOUND_THREAD_SAFE=0
/usr/bin/bluealsa -i hci0 -p a2dp-source &

sudo reboot之后通过ps -ef | grep bluealsa命令确认它在运行。

参考资料:

  1. alsa - How to stream sound to a bluetooth device from a raspberry pi zero - Raspberry Pi Stack Exchange
  2. Using the BlueALSA ALSA pcm plugin · Arkq/bluez-alsa Wiki
  3. Gitee 极速下载/Bluetooth Audio ALSA Backend
  4. Arkq/bluez-alsa: Bluetooth Audio ALSA Backend
  5. Help with “Couldn’t get BlueALSA PCM: PCM not found” error · Issue #394 · Arkq/bluez-alsa
    6.sound - Sending audio to bluetooth speaker with bluealsa - Ask Ubuntu
  6. pi 3 - Raspberry Pi 3, can’t connect to more than one bluetooth speaker via pulseaudio - Raspberry Pi Stack Exchange
  7. alsa - How to stream sound to a bluetooth device from a raspberry pi zero - Raspberry Pi Stack Exchange
  8. Couldn’t get BlueALSA PCM: PCM not found · Issue #553 · Arkq/bluez-alsa
  9. alsa - I want to allow two instances of mPlayer to play music over a single bluetooth link to a speaker - Raspberry Pi Stack Exchange
  10. [SOLVED] RPi4 Bluetooth woes - Raspberry Pi Forums
  11. A script to play all audio formats. You only need the dll’s found at https://github.com/elibroftw/music-caster/tree/master/vlc
  12. Bluetooth audio on a headless Raspberry Pi using BlueAlsa — introt docs
  13. Raspberry Pi Bluetooth Speaker: Play Audio Wirelessly using Raspberry Pi(Pi作为Bluetooth Sink)
  14. BlueALSA: Bluetooth-Audio using ALSA (not PulseAudio) - Off-topic - Armbian Community Forums
  15. dotfiles/bluealsa_dev_select.sh at master · ohel/dotfiles
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值