互联网上教你怎么用树莓派做蓝牙 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-rpi3pi-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,重启后看看进程中 bluetoothdhciattach-rpi3 有没有在运行。确认 bluetooth.servicebrcm43438.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 可以方便地调节。

如果有问题可以点击查看这里逐一排查