Raspberry连接蓝牙音箱

项目运行环境

安装依赖程序

  1. 由Bluez提供蓝牙协议栈和bluetoothctl工具
  2. Bluez和PulseAudio的连接是由模块pulseaudio-module-bluetooth完成的
  3. 蓝牙音频有A2DP/HSP/HFP三种模式,A2DP和HSP:BlueZ -> PulseAudio -> ALSA,而HFP则还需要oFono模块
  4. 使用omxplayer来播放音频时需指定输出设备为alsa
1
sudo apt install bluez bluez-firmware pulseaudio pulseaudio-module-bluetooth

启动Pulseaudio

1
2
3
4
5
6
# Pulseaudio在播放完成后自动退出可根据如下修改后重新启动Pulseaudio守护程序。
# 编辑 /etc/pulse/daemon.conf 取消注释(删除;)并放入负值:exit-idle-time = -1

ps aux | grep pulseaudio # 查看程序是否运行
sudo pulseaudio -k # 关闭pulseaudio
sudo pulseaudio --start # 启动pulseaudio

连接蓝牙设备

  1. 添加pi用户到蓝牙组后重启,否则普通用户pi无法操作蓝牙:sudo usermod -G bluetooth -a pi

  2. 如果不添加用户到蓝牙组,那么全局都需要以root用户运行,否则将正常无法播放

  3. 重启后蓝牙连接不需要重复配对,只需要执行:connect F4:4E:FD:F0:2A:69 即可

  4. 连接蓝牙设备

1
2
3
4
5
6
7
8
9
10
11
sudo hciconfig -a			# 查看设备
sudo bluetoothctl # 进入交互

# 以下是在bluetoothctl交互环境中执行
[bluetooth]# power on # 打开蓝牙
[bluetooth]# agent on # 启动代理
[bluetooth]# default-agent # 默认代理
[bluetooth]# scan on # 开始扫描
[bluetooth]# pair F4:4E:FD:F0:2A:69 # 设备配对
[bluetooth]# trust F4:4E:FD:F0:2A:69 # 添加信任
[bluetooth]# connect F4:4E:FD:F0:2A:69 # 连接设备
  1. 其他蓝牙命令
1
2
3
4
5
6
7
8
9
10
11
12
hciconfig hci0 up		# 打开蓝牙
hciconfig hci0 off # 关闭蓝牙
hciconfig hciX piscan # 可被发现

hcitool dev # 查看设备
hcitool scan # 进行扫描
hcitool lescan # 低功耗扫描
hcitool auth F4:4E:FD:F0:2A:69 # 设备配对
hcitool cc F4:4E:FD:F0:2A:69 # 连接设备
hcitool dc F4:60:E2:73:40:B9 # 断开连接

l2ping F4:60:E2:73:40:B9 # 测试蓝牙的连通性

选择播放声卡

1
2
3
4
5
6
7
8
sudo pacmd list-cards	# 查看现有声卡
sudo pacmd list-sinks # 列出输出声卡
sudo pacmd set-default-sink bluez_sink.F4_4E_FD_F0_2A_69.a2dp_sink # 选择默认播放的声卡

# 测试音频播放,下面测试任选一个即可
sudo aplay xxx.wav # 测试wav播放
sudo paplay xxx.ogg # 测试ogg播放
sudo omxplayer -o alsa xxx.mp3 # 测试mp3播放

发现其他问题

  1. 非ROOT权限能连接蓝牙音箱但播放无声音

  2. 连接时出现错误:Failed to connect: org.bluez.Error.Failed

1
2
3
4
5
6
7
8
[bluetooth]# connect F4:4E:FD:F0:2A:69
Attempting to connect to F4:4E:FD:F0:2A:69
Failed to connect: org.bluez.Error.Failed
[bluetooth]#

解决方法:重启pluseaudio
pulseaudio -k
pulseaudio --start