互联网上教你怎么用树莓派做蓝牙 A2DP 接收器的教程一搜一把,但绝大多数都要你用外接的蓝牙模块,或者 USB 蓝牙适配器。但 3B 其实有个自带的 Wifi 模块,同时也是个蓝牙模块,速度和稳定性也还不错,用不着再外接。这里写 ArchlinuxARM 的树莓派 3B 怎么配置。
先讲下什么叫 A2DP,Advanced Audio Distribution Profile,说白了叫音频分发配置,可以通过蓝牙传输立体声音乐。设为 A2DP 后可以被当做蓝牙接收器。
0. 安装依赖
bluez
,bluez-utils
,pulseaudio
,pulseaudio-bluetooth
等等等等,按照 pacman 的指示安装下去就好。
1. 加设备树参数
在你树莓派的 boot 启动分区里编辑 config.txt
,加一行 device_tree_param=audio=on
,这是开启音频输出;
然后再加一行 dtoverlay=pi3-disable-wifi
,注意这是禁用板载 wifi 功能,原因是树莓派的官方固件 bug,蓝牙和 wifi 同时使用会不稳定。可以先不禁用,后面如确实发现有此问题再加上这个参数。
2. 安装额外软件和固件
经过我的惨痛踩坑,发现使用 archlinux 新的 btattach
来加载蓝牙模块是有问题的,加载的固件在缓冲区使用上有严重问题,造成音频几乎完全无法传输。(这里没有验证过到底是固件本身的问题还是 btattach
UART 配置的问题,流控上的问题,或者是其他什么问题)换用原来 hciattach
配合原来的 hcd 固件就没有问题。这里 hciattach
最好使用一个修改版本,不然在莓派上使用会有个小问题。
前往 AUR 安装两个包 hciattach-rpi3
和 pi-bluetooth
,按顺序安装。树莓派上没有安装 aur helper 的话,把这两个 git 仓库 clone 下来,make -Acs
自动打包,再用 pacman -U
就能安装了。
3. 蓝牙启动的额外配置
装完上面两个包,还需要再做些改动。
-
自动启动蓝牙挂接服务,
systemctl enable brcm43438.service
; -
把
/etc/udev/rules.d/50-bluetooth-hci-auto-poweron.rules
删掉,然后修改/etc/bluetooth/main.conf
,在[Policy]
后添加设置AutoEnable=true
; -
修改
bluez
服务的启动顺序,为了避免 bluez 升级后把修改的内容覆盖掉,可以先把/usr/lib/systemd/system/bluetooth.service
拷贝一份到/etc/systemd/system/
下,然后修改/etc/systemd/system/bluetooth.service
如下:[Unit] Description=Bluetooth service Documentation=man:bluetoothd(8) After=brcm43438.service bluetooth.target Requires=brcm43438.service BindsTo=brcm43438.service #ConditionPathIsDirectory=/sys/class/bluetooth [Service] Type=dbus BusName=org.bluez ExecStart=/usr/lib/bluetooth/bluetoothd NotifyAccess=main #WatchdogSec=10 CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE LimitNPROC=1 ProtectHome=true ProtectSystem=full Restart=always [Install] WantedBy=bluetooth.target Alias=dbus-org.bluez.service
-
然后
systemctl enable bluetooth.service
,重启后看看进程中bluetoothd
和hciattach-rpi3
有没有在运行。确认bluetooth.service
和brcm43438.service
两个服务 active running 正常运行后,就可以进入下一步配置了。
4. 连接和配对蓝牙
以 root 权限运行 bluetoothctl
,接下来就可以按照正常流程进行配对了,配对完成后,不要忘记 trust 配对的设备,否则可能会被频繁断开连接,并且最后要关闭蓝牙扫描、关闭蓝牙可见性,防止被其他人连接和控制。点此查看 bluetoothctl
常规配对流程.
5. 配置 bluez 与 pulseaudio
到这里就要完成整个 A2DP 运行系统的配置了
-
修改
/etc/bluetooth/audio.conf
如下:[General] Enable=Source, Sink, Media Disable=Socket
-
修改
/etc/pulse/default.pa
,添加一个自动切换模块load-module module-switch-on-connect ignore_virtual=no
,把load-module module-switch-on-connect
注释掉。
好了,现在树莓派 3.5mm 口接上音响,重启后看看能不能连接上蓝牙,放一首音乐看看有没有声音?正常情况下 systemctl status bluetooth
会输出类似下面的日志:
Endpoint registered: sender=:1.9 path=/MediaEndpoint/A2DPSource
Endpoint registered: sender=:1.9 path=/MediaEndpoint/A2DPSink
要方便地调节树莓派的输出音量,可以安装 alsa-utils
包,使用 alsamixer
可以方便地调节。