前言

本篇文章采用的是lean大的Openwrt源码进行编译

截止20220902,暂且不建议采用arch系(包括manjaro)进行编译,实测avahi部分有点问题,而且是shairplay/airplay2的依赖项。可能是arch包过新了,实测ub22编译通过。

如何编译openwrt不再累述,lede的readme写的很清楚。

因为学校把有线网口砍了,整成了全wifi6覆盖,想来想去把我那N2840的小主机整了个AX210上去,跑了个op,拿来无线桥接用。ax210是网卡蓝牙一体的,干脆就把蓝牙一起利用上吧。
虽然N2840已经连小猫咪都跑不动了,但是好歹是x86,能用


准备工作

先说下我这边用的硬件吧:
IMG_1247
x86_64的小主机,Intel® Celeron® Processor N2840
Intel® Wi-Fi 6E AX210
小米随身音箱


然后是编译openwrt所需要勾选的:
参照官方文档部分Bluetooth in openwrt

  • kmod-input-uinput
  • sbc
  • bluez系列,bluez-daemon,bluez-tools,bluez-utils,bluez-utils-extra
    (bluez为Linux Bluetooth 栈)
  • dbus-utils
  • kmod-6lowpan
  • kmod-bluetooth_6lowpan
  • dbus(bluez需要)
  • kmod-usb-core
    (蓝牙走usb协议,故勾选上usb部分)
  • kmod-usb-uhci
  • kmod-usb-ohci
  • kmod-usb2
  • kmod-usb3
  • kmod-bluetooth
  • usbutils
  • ibt-firmware (intel蓝牙驱动固件,wifi的话勾上iwlwifi和iwlwifi-firmware-* 系列)
  • luci-app-shairplay
  • luci-app-airplay2
    (两个均用于airplay,保险点都带上)
    (kmod均为kernel module系列,如果找不到,请善于使用“/”键搜索)

带上bluez-alsa包

bluez-alsa部分仅在x86_64上测试通过,别的平台自行测试

如标题所述,带上这玩意。
不难发现,上面的包相比官方文档中少了pulseaudio。
因为我们用的shairplay,以及airplay2均(可)采用alsa,所以没必要带上pulseaudio。
那么这玩意,lede里并没带上,我们需要手动搞一搞。
这玩意是alsa的蓝牙音频后端,它用来实现与蓝牙音频设备的连接,在alsa环境下,没这玩意音响根本连不上。
有大佬搞过openwrt的bluezalsa,但是比较旧了,我们下下来改改
打开lede源码的feeds/packages/utils
创建一个名为bluez-alsa的文件夹
在这个文件夹下打开终端

wget https://raw.githubusercontent.com/diizzyy/packages/sound-bluez-alsa/sound/bluez-alsa/Makefile
mkdir files
cd files
wget https://raw.githubusercontent.com/diizzyy/packages/sound-bluez-alsa/sound/bluez-alsa/files/bluealsa.init

这个大佬是2018年搞得,然后根据bluez-alsa源码issue里的说法是他搞了以后就不玩这玩意了,所以就没更过,所以我们得进行一些更新。


改makefile

文本打开makefile
首先是bluezalsa的版本,该换新的了
懂得人应该知道它这个url的地址下源码包根据commit来,改改commit值,hash值用sha256sum得出来放上去就完事了
那我这提供一份截止到20220903版本的
20231030更新:

PKG_VERSION:=20231024
PKG_SOURCE_URL:=https://codeload.github.com/Arkq/$(PKG_NAME)/tar.gz/72bada7?dummy=/
PKG_HASH:=5c89be7dc8105049ec89f7bf4abde568ad3a30d52bea64ad75270fea421561d8
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-72bada7

修改对应的就行
在define Package/bluez-alsa中
也就是29行
DEPENDS:=,去掉最后的@LINUX_4_14,现在都标准5.15,新的5.19时代了。
6.1时代了
然后删掉第47行的

$(INSTALL_BIN) $(PKG_BUILD_DIR)/utils/bluealsa-aplay $(1)/usr/bin/

我这边测试编译出来已经没有这个了,所以会导致报错。
然后就改完了,menuconfig里勾选上bluez-alsa即可。


开机后修改工作

编译,刷入,开机
然后开始处理后续工作

此处部分参考了 Tema: Transformar el router en altavoz bluetooth文章


AX210的额外工作

开机后在内核日志中不难发现Bluetooth有报错,原因是找不到蓝牙的固件,ssh查看文件看了看确实没有,需要手动补上

前面带的ibt-firmware没有210要用的

根据报错信息可知,ax210需要ibt-0041-0041.ddc以及ibt-0041-0041.sfi文件,可在Index of /sources/linux-firmware/intel这里下载到,然后放到/lib/firmware/intel/下,重启即可正常读取加载。


继续,在openwrt中进行修改

  • /etc/bluetooth/下创建一个audio.conf,内容:

    [General]
    Enable=Source
  • 修改/etc/init.d/bluealsa
    将原本的

    procd_set_param command "$PROG" -i hci0

    改为

    procd_set_param command "$PROG" -i hci0 -p a2dp-source

可能有人就会说了,为啥不在上面源码里就改好,还现在改。原因:bluealsa的-p参数是profile,也就是加载何种配置文件。我这边是以openwrt去连蓝牙音响,所以是a2dp-source,source端也就是发送音频流的。如果你的设备原本就是带声卡带扬声器,想拿openwrt作为蓝牙音响的,那就是a2dp-sink,sink端也就是接收音频的。

至于上面audio.conf那个source,根据参考的文章里的意思是即使干的sink端的活,但是还是填source,bluez中就是这样。

  • 在/etc/dbus-1/system.d/下创建bluealsa.conf
    内容:
<!-- This configuration file specifies the required security policies
     for BlueALSA core daemon to work. -->

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>

  <!-- ../system.conf have denied everything, so we just punch some holes -->

  <policy user="root">
    <allow own_prefix="org.bluealsa"/>
    <allow send_destination="org.bluealsa"/>
  </policy>

  <policy group="audio">
    <allow send_destination="org.bluealsa"/>
  </policy>

</busconfig>
  • 修改/etc/asound.conf
    加上
defaults.bluealsa.service "org.bluealsa"
defaults.bluealsa.interface "hci0"
defaults.bluealsa.profile "a2dp"
defaults.bluealsa.delay 10000
pcm.!default {
    type asym
    capture.pcm cards.pcm.default
    playback.pcm bluealsa
    hint.description "Capture: sysdefault, Playback: BlueALSA Bluetooth
Default Audio Device"
}

ctl.!default {
    type bluealsa
    hint.description "Default control device (BlueALSA Bluetooth)"
}

然后建议重启系统,当然也可以

service dbus restart
service bluetoothd restart
service bluealsa restart

反正还是建议重启(


连 蓝 牙

修是修改完了,该连了
书接上文,重启完了(
ssh进去,先康康有没有蓝牙设备

hciconfig

QQ截图20220903010049
默认是关闭状态,但是有设备,我们来操作它

bluetoothctl
power on
scan on

开始扫描蓝牙设备,把蓝牙音响进入配对模式
扫描到蓝牙音响后

scan off

关闭扫描,记录下蓝牙音响的mac地址,这里假设mac地址为XX

pair XX
trust XX
connect XX

QQ截图20220903010453
连接成功后就会出现这个提示,如果没有bluez-alsa,这边connect是失败的,系统日志可以看到具体报错。

连上后就可以退出bluetoothctl了,输入exit退出
用alsamixer,可以看到默认设备就是蓝牙音响了
QQ截图20220903010809
在这可调整音量,现在我们可以先拿个曲子试试(需要wav,mp3会播杂音)
QQ截图20220903011124
正常播放,挺好


airplay设置

嘛。我本来是想用airplay2的,但是不知道为啥没声,或者说和挤牙膏那种不正常,改了半天配置也不正常。用airplay的小伙伴可以参考【LEDE】x86软路由之路-11-Shairport音乐推流(安卓+IOS)这篇文章改改试试,音频输出设备用默认就行

顺便说下这个音频输出设备,shairplay和airplay2都是找硬件的,也就是/proc/asound里的card,蓝牙的这个音响,他不会出现在alsa的内核proc接口中。即使是bluez-alsa也不会,bluealsa这个PCM设备是基于ALSA软件PCM I/O插件的。这在bluez-alsa中有说。上面的修改有让bluealsa成为默认设备

我这边shairplay是完全正常的,放一张设置图
QQ截图20220903011941
最后就可以用mac/ios走airplay播放到蓝牙音响了


最后

嘛,折腾老半天了,查资料也没找到几个我这种需求的,倒腾一下午都快打算搞有线音响的时候搞定了。。
由于openwrt默认关蓝牙,所以重启后也要手动开,当然,自启脚本里面写上也就完事了。
实测开蓝牙后会自动连配对过的设备。


本文除去文中给出的引用连接参考部分,其他均为原创

转载请注明作者和原文链接