木马派RV1106开发板驱动AIC8800DC USB蓝牙模块,用bluez-alsa库与蓝牙音箱配对并播放wav声音文件

木马派RV1106开发板上的AIC8800DC是USB接口的WiFi蓝牙二合一模块,和RV1106之间只需要用USB接口连接,不需要接UART串口。

第一节 编译bluez-5.66蓝牙协议栈

幸狐自带的arm-rockchip830-linux-uclibcgnueabihf-gcc编译器的版本号是gcc version 8.3.0 (crosstool-NG 1.24.0)。
gcc版本太低,缺少wordexp.h,无法编译bluez-5.66。
下载arm官网的交叉编译器:arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-linux-gnueabihf
下载地址:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads/14-2-rel1
文件名:
AArch32 GNU/Linux target with hard float (arm-none-linux-gnueabihf)
arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz
下载下来后解压到电脑linux虚拟机上的~/Downloads目录下。

将交叉编译器的路径添加到PATH环境变量中:
export PATH=$PATH:/home/oct1158/Downloads/arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-linux-gnueabihf/bin
(在命令行窗口中执行,关闭命令行窗口前一直有效,关闭窗口后失效)
查看交叉编译器的版本:arm-none-linux-gnueabihf-gcc -v
版本为gcc version 14.2.1 20241119 (Arm GNU Toolchain 14.2.Rel1 (Build arm-14.52))

linux虚拟机系统:Fedora 42
工作目录:
mkdir ~/Downloads/bluez
cd ~/Downloads/bluez

【交叉编译libffi-3.5.1】

wget https://github.com/libffi/libffi/releases/download/v3.5.1/libffi-3.5.1.tar.gz
tar xf libffi-3.5.1.tar.gz
cd libffi-3.5.1
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译zlib-1.3.1】

wget https://www.zlib.net/zlib-1.3.1.tar.gz
tar xf zlib-1.3.1.tar.gz
cd zlib-1.3.1

(注意下面这是一行命令,不是两行)
CC=arm-none-linux-gnueabihf-gcc AR=arm-none-linux-gnueabihf-ar LD=arm-none-linux-gnueabihf-ld ./configure --prefix=/opt/bluez

make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译glib-2.59.0】
glib-2.57.1是最后一个压缩包里面有configure脚本的版本。
glib-2.59.0是最后一个压缩包里面有configure.ac文件的版本。
从glib-2.59.1版本开始就只支持meson了,不再支持configure了。

wget https://download.gnome.org/sources/glib/2.59/glib-2.59.0.tar.xz
tar xf glib-2.59.0.tar.xz
cd glib-2.59.0
sudo dnf install autoconf
sudo dnf install automake
sudo dnf install libtool
sudo dnf install gtk-doc
autoreconf --install
echo glib_cv_stack_grows=no > arm-linux.cache
echo glib_cv_uscore=no >> arm-linux.cache
./configure --host=arm-none-linux-gnueabihf --cache-file=arm-linux.cache --prefix=/opt/bluez \
  --disable-libelf --disable-libmount --with-pcre=internal \
  LIBFFI_CFLAGS=-I$(pwd)/../libffi-3.5.1/_install/opt/bluez/include \
  LIBFFI_LIBS="-L$(pwd)/../libffi-3.5.1/_install/opt/bluez/lib -lffi" \
  ZLIB_CFLAGS=-I$(pwd)/../zlib-1.3.1/_install/opt/bluez/include \
  ZLIB_LIBS="-L$(pwd)/../zlib-1.3.1/_install/opt/bluez/lib -lz"
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译expat-2.7.1】

wget https://github.com/libexpat/libexpat/releases/download/R_2_7_1/expat-2.7.1.tar.gz
tar xf expat-2.7.1.tar.gz
cd expat-2.7.1
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez --without-docbook
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译dbus-1.15.8】
dbus-1.15.6是最后一个压缩包里面有configure脚本的版本。
dbus-1.15.8是最后一个压缩包里面有configure.ac文件的版本。
从dbus-1.15.10版本开始就只支持meson了,不再支持configure了。

交叉编译受电脑系统环境影响。
如果编译时报glib或者selinux的错误,请卸载系统里面安装的glib2开发包:sudo dnf remove glib2-devel

wget https://dbus.freedesktop.org/releases/dbus/dbus-1.15.8.tar.xz
tar xf dbus-1.15.8.tar.xz
cd dbus-1.15.8
sudo dnf install autoconf-archive
autoreconf --install
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez \
  EXPAT_CFLAGS=-I$(pwd)/../expat-2.7.1/_install/opt/bluez/include \
  EXPAT_LIBS="-L$(pwd)/../expat-2.7.1/_install/opt/bluez/lib -lexpat"
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译libical-3.0.20】

wget https://github.com/libical/libical/releases/download/v3.0.20/libical-3.0.20.tar.gz
tar xf libical-3.0.20.tar.gz
cd libical-3.0.20

(注意下面这是一行命令,不是两行)
CC=arm-none-linux-gnueabihf-gcc CXX=arm-none-linux-gnueabihf-g++ cmake . -DICAL_GLIB=False -DCMAKE_INSTALL_PREFIX=/opt/bluez

make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译readline-8.2.13】

wget https://ftp.gnu.org/gnu/readline/readline-8.2.13.tar.gz
tar xf readline-8.2.13.tar.gz
cd readline-8.2.13
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译ncurses-6.5】

wget https://ftp.gnu.org/gnu/ncurses/ncurses-6.5.tar.gz
tar xf ncurses-6.5.tar.gz
cd ncurses-6.5
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez --with-shared
make
修改progs/Makefile文件里面第82行的INSTALL_PROG变量,在变量值的末尾添加
--strip-program=arm-none-linux-gnueabihf-strip
然后make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译bluez-5.66】

wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.66.tar.xz
tar xf bluez-5.66.tar.xz
cd bluez-5.66
sudo dnf install python-docutils
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez \
  --disable-udev \
  --enable-deprecated \
  --enable-library \
  --with-dbusconfdir=/opt/bluez/share \
  --with-dbussystembusdir=/root/bluetooth \
  --with-dbussessionbusdir=/root/bluetooth \
  --with-systemdsystemunitdir=/root/bluetooth \
  --with-systemduserunitdir=/root/bluetooth \
  DBUS_CFLAGS="-I$(pwd)/../dbus-1.15.8/_install/opt/bluez/include/dbus-1.0 -I$(pwd)/../dbus-1.15.8/_install/opt/bluez/lib/dbus-1.0/include" \
  DBUS_LIBS="-L$(pwd)/../dbus-1.15.8/_install/opt/bluez/lib -ldbus-1" \
  GLIB_CFLAGS="-I$(pwd)/../glib-2.59.0/_install/opt/bluez/include/glib-2.0 -I$(pwd)/../glib-2.59.0/_install/opt/bluez/lib/glib-2.0/include" \
  GLIB_LIBS="-L$(pwd)/../glib-2.59.0/_install/opt/bluez/lib -lglib-2.0" \
  ICAL_CFLAGS=-I$(pwd)/../libical-3.0.20/_install/opt/bluez/include \
  ICAL_LIBS="-L$(pwd)/../libical-3.0.20/_install/opt/bluez/lib -lical -licalvcal" \
  CFLAGS=-I$(pwd)/../readline-8.2.13/_install/opt/bluez/include \
  LDFLAGS="-L$(pwd)/../readline-8.2.13/_install/opt/bluez/lib -L$(pwd)/../ncurses-6.5/_install/opt/bluez/lib" \
  LIBS=-lncursesw
make
make install DESTDIR=$(pwd)/_install
cd ..

注意:
--enable-deprecated选项是为了编译出ciptool、hciattach、hciconfig、hcidump、hcitool、rfcomm和sdptool这7个命令。
--enable-library选项是为了生成bluetooth/bluetooth.h和libbluetooth.so。
--with-dbusconfdir目录必须设置为dbus的安装目录下的share目录。其他四个目录没有用,随便写。

【打包】
mkdir _install
(复制文件时必须加sudo,这样才能保证文件解压到板子上后所有者是root)
sudo cp -r libffi-3.5.1/_install/* _install
sudo cp -r zlib-1.3.1/_install/* _install
sudo cp -r glib-2.59.0/_install/* _install
sudo cp -r expat-2.7.1/_install/* _install
sudo cp -r dbus-1.15.8/_install/* _install
sudo cp -r libical-3.0.20/_install/* _install
sudo cp -r readline-8.2.13/_install/* _install
sudo cp -r ncurses-6.5/_install/* _install
sudo cp -r bluez-5.66/_install/* _install
cd _install
(进去后只有opt和root目录,如果有其他目录说明之前操作有误)
tar cf bluez.tar opt root

第二节 编译bluez-alsa-4.3.1库

mkdir ~/Downloads/bluez-alsa
cd ~/Downloads/bluez-alsa

【交叉编译alsa-lib-1.2.14】

wget https://www.alsa-project.org/files/pub/lib/alsa-lib-1.2.14.tar.bz2
tar xf alsa-lib-1.2.14.tar.bz2
cd alsa-lib-1.2.14
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译alsa-utils-1.2.14】

wget https://www.alsa-project.org/files/pub/utils/alsa-utils-1.2.14.tar.bz2
tar xf alsa-utils-1.2.14.tar.bz2
cd alsa-utils-1.2.14
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa \
  --with-udev-rules-dir=/opt/bluez-alsa/usr/lib/udev/rules.d \
  --with-systemdsystemunitdir=/opt/bluez-alsa/usr/lib/systemd/system \
  --with-asound-state-dir=/opt/bluez-alsa/var/lib/alsa \
  NCURSESW_CFLAGS="-I$(pwd)/../../bluez/ncurses-6.5/_install/opt/bluez/include -I$(pwd)/../../bluez/ncurses-6.5/_install/opt/bluez/include/ncursesw" \
  NCURSESW_LIBS="-L$(pwd)/../../bluez/ncurses-6.5/_install/opt/bluez/lib -lncursesw" \
  CFLAGS=-I$(pwd)/../alsa-lib-1.2.14/_install/opt/bluez-alsa/include \
  LDFLAGS=-L$(pwd)/../alsa-lib-1.2.14/_install/opt/bluez-alsa/lib \
  LIBS=-lasound
修改../alsa-lib-1.2.14/_install/opt/bluez-alsa/lib/libatopology.la文件,删除dependency_libs字符串里面的/opt/bluez-alsa/lib/libasound.la。
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译libogg-1.3.6】

wget https://ftp.osuosl.org/pub/xiph/releases/ogg/libogg-1.3.6.tar.gz
tar xf libogg-1.3.6.tar.gz
cd libogg-1.3.6
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译flac-1.5.0】

wget https://ftp.osuosl.org/pub/xiph/releases/flac/flac-1.5.0.tar.xz
tar xf flac-1.5.0.tar.xz
cd flac-1.5.0
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa \
  CFLAGS=-I$(pwd)/../libogg-1.3.6/_install/opt/bluez-alsa/include \
  LDFLAGS=-L$(pwd)/../libogg-1.3.6/_install/opt/bluez-alsa/lib \
  LIBS=-logg
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译libvorbis-1.3.7】

wget https://ftp.osuosl.org/pub/xiph/releases/vorbis/libvorbis-1.3.7.tar.gz
tar xf libvorbis-1.3.7.tar.gz
cd libvorbis-1.3.7
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa --with-ogg=$(pwd)/../libogg-1.3.6/_install/opt/bluez-alsa
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译opus-1.5.2】

wget https://downloads.xiph.org/releases/opus/opus-1.5.2.tar.gz
tar xf opus-1.5.2.tar.gz
cd opus-1.5.2
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译lame-3.100】 

wget https://nchc.dl.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
tar xf lame-3.100.tar.gz
cd lame-3.100
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译mpg123-1.32.10】

wget https://cyfuture.dl.sourceforge.net/project/mpg123/mpg123/1.32.10/mpg123-1.32.10.tar.bz2
tar xf mpg123-1.32.10.tar.bz2
cd mpg123-1.32.10
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译sqlite3】

wget https://sqlite.org/2025/sqlite-autoconf-3500300.tar.gz
tar xf sqlite-autoconf-3500300.tar.gz
cd sqlite-autoconf-3500300
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译libsndfile-1.2.2】 

wget https://github.com/libsndfile/libsndfile/releases/download/1.2.2/libsndfile-1.2.2.tar.xz
tar xf libsndfile-1.2.2.tar.xz
cd libsndfile-1.2.2
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa \
  FLAC_CFLAGS=-I$(pwd)/../flac-1.5.0/_install/opt/bluez-alsa/include \
  FLAC_LIBS="-L$(pwd)/../flac-1.5.0/_install/opt/bluez-alsa/lib -lFLAC -L$(pwd)/../libogg-1.3.6/_install/opt/bluez-alsa/lib -logg" \
  VORBIS_CFLAGS=-I$(pwd)/../libvorbis-1.3.7/_install/opt/bluez-alsa/include \
  VORBIS_LIBS="-L$(pwd)/../libvorbis-1.3.7/_install/opt/bluez-alsa/lib -lvorbis -L$(pwd)/../libogg-1.3.6/_install/opt/bluez-alsa/lib -logg" \
  VORBISENC_CFLAGS=-I$(pwd)/../libvorbis-1.3.7/_install/opt/bluez-alsa/include \
  VORBISENC_LIBS="-L$(pwd)/../libvorbis-1.3.7/_install/opt/bluez-alsa/lib -lvorbis -L$(pwd)/../libogg-1.3.6/_install/opt/bluez-alsa/lib -logg -lvorbisenc" \
  OPUS_CFLAGS=-I$(pwd)/../opus-1.5.2/_install/opt/bluez-alsa/include \
  OPUS_LIBS="-L$(pwd)/../opus-1.5.2/_install/opt/bluez-alsa/lib -lopus" \
  MPG123_CFLAGS=-I$(pwd)/../mpg123-1.32.10/_install/opt/bluez-alsa/include \
  MPG123_LIBS="-L$(pwd)/../mpg123-1.32.10/_install/opt/bluez-alsa/lib -lmpg123" \
  SQLITE3_CFLAGS=-I$(pwd)/../sqlite-autoconf-3500300/_install/opt/bluez-alsa/include \
  SQLITE3_LIBS=-L$(pwd)/../sqlite-autoconf-3500300/_install/opt/bluez-alsa/lib \
  OGG_CFLAGS=-I$(pwd)/../libogg-1.3.6/_install/opt/bluez-alsa/include \
  OGG_LIBS="-L$(pwd)/../libogg-1.3.6/_install/opt/bluez-alsa/lib -logg" \
  CFLAGS=-I$(pwd)/../lame-3.100/_install/opt/bluez-alsa/include \
  LDFLAGS=-L$(pwd)/../lame-3.100/_install/opt/bluez-alsa/lib
修改../flac-1.5.0/_install/opt/bluez-alsa/lib/libFLAC.la和../libvorbis-1.3.7/_install/opt/bluez-alsa/lib/libvorbis.la,去除dependency_libs字符串里面的/opt/bluez-alsa/lib/libogg.la。
修改../libvorbis-1.3.7/_install/opt/bluez-alsa/lib/libvorbisenc.la文件,去除dependency_libs字符串里面的首尾两处/opt/bluez-alsa/lib/libvorbis.la。
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译sbc-2.1】

wget https://www.kernel.org/pub/linux/bluetooth/sbc-2.1.tar.gz
tar xf sbc-2.1.tar.gz
cd sbc-2.1
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa \
  SNDFILE_CFLAGS=-I$(pwd)/../libsndfile-1.2.2/_install/opt/bluez-alsa/include \
  SNDFILE_LIBS="-L$(pwd)/../libsndfile-1.2.2/_install/opt/bluez-alsa/lib -lsndfile -L$(pwd)/../flac-1.5.0/_install/opt/bluez-alsa/lib -lFLAC -L$(pwd)/../libogg-1.3.6/_install/opt/bluez-alsa/lib -logg -L$(pwd)/../libvorbis-1.3.7/_install/opt/bluez-alsa/lib -lvorbis -lvorbisenc -L$(pwd)/../opus-1.5.2/_install/opt/bluez-alsa/lib -lopus -L$(pwd)/../mpg123-1.32.10/_install/opt/bluez-alsa/lib -lmpg123 -L$(pwd)/../lame-3.100/_install/opt/bluez-alsa/lib -lmp3lame"
make
make install DESTDIR=$(pwd)/_install
cd ..

【交叉编译bluez-alsa-4.3.1】

wget https://github.com/arkq/bluez-alsa/archive/refs/tags/v4.3.1.tar.gz -O bluez-alsa-4.3.1.tar.gz
tar xf bluez-alsa-4.3.1.tar.gz
cd bluez-alsa-4.3.1
autoreconf --install
sudo dnf install glib2-devel
./configure --host=arm-none-linux-gnueabihf --prefix=/opt/bluez-alsa \
  --with-dbusconfdir=/opt/bluez/share/dbus-1/system.d \
  --with-alsaplugindir=/opt/bluez-alsa/lib/alsa-lib \
  ALSA_CFLAGS=-I$(pwd)/../alsa-lib-1.2.14/_install/opt/bluez-alsa/include \
  ALSA_LIBS="-L$(pwd)/../alsa-lib-1.2.14/_install/opt/bluez-alsa/lib -lasound" \
  BLUEZ_CFLAGS=-I$(pwd)/../../bluez/bluez-5.66/_install/opt/bluez/include \
  BLUEZ_LIBS="-L$(pwd)/../../bluez/bluez-5.66/_install/opt/bluez/lib -lbluetooth" \
  DBUS1_CFLAGS="-I$(pwd)/../../bluez/dbus-1.15.8/_install/opt/bluez/include/dbus-1.0 -I$(pwd)/../../bluez/dbus-1.15.8/_install/opt/bluez/lib/dbus-1.0/include" \
  DBUS1_LIBS=-L"$(pwd)/../../bluez/dbus-1.15.8/_install/opt/bluez/lib -ldbus-1" \
  GIO2_CFLAGS=-I$(pwd)/../../bluez/glib-2.59.0/_install/opt/bluez/include/gio-unix-2.0 \
  GIO2_LIBS="-L$(pwd)/../../bluez/glib-2.59.0/_install/opt/bluez/lib -lgio-2.0 -lgobject-2.0 -lgmodule-2.0 -lffi" \
  GLIB2_CFLAGS="-I$(pwd)/../../bluez/glib-2.59.0/_install/opt/bluez/include/glib-2.0 -I$(pwd)/../../bluez/glib-2.59.0/_install/opt/bluez/lib/glib-2.0/include" \
  GLIB2_LIBS="-L$(pwd)/../../bluez/glib-2.59.0/_install/opt/bluez/lib -lglib-2.0" \
  SBC_CFLAGS=-I$(pwd)/../sbc-2.1/_install/opt/bluez-alsa/include \
  SBC_LIBS="-L$(pwd)/../sbc-2.1/_install/opt/bluez-alsa/lib -lsbc"
修改../../bluez/glib-2.59.0/_install/opt/bluez/lib/libgio-2.0.la文件,删除dependency_libs字符串里面的/opt/bluez/lib/libgmodule-2.0.la、/opt/bluez/lib/libgobject-2.0.la、/opt/bluez/lib/libglib-2.0.la和/opt/bluez/lib/libffi.la。
修改../../bluez/glib-2.59.0/_install/opt/bluez/lib/libgobject-2.0.la文件,删除dependency_libs字符串里面的/opt/bluez/lib/libglib-2.0.la和/opt/bluez/lib/libffi.la。
修改../../bluez/glib-2.59.0/_install/opt/bluez/lib/libgmodule-2.0.la文件,删除dependency_libs字符串里面的/opt/bluez/lib/libglib-2.0.la。
make
make install DESTDIR=$(pwd)/_install
sudo dnf remove glib2-devel(建议卸载,避免影响编译其他软件包)
cd ..

【打包】
mkdir _install
(复制文件时必须加sudo,这样才能保证文件解压到板子上后所有者是root)
sudo cp -r alsa-lib-1.2.14/_install/* _install
sudo cp -r alsa-utils-1.2.14/_install/* _install
sudo cp -r libogg-1.3.6/_install/* _install
sudo cp -r flac-1.5.0/_install/* _install
sudo cp -r libvorbis-1.3.7/_install/* _install
sudo cp -r opus-1.5.2/_install/* _install
sudo cp -r lame-3.100/_install/* _install
sudo cp -r mpg123-1.32.10/_install/* _install
sudo cp -r sqlite-autoconf-3500300/_install/* _install
sudo cp -r libsndfile-1.2.2/_install/* _install
sudo cp -r sbc-2.1/_install/* _install
sudo cp -r bluez-alsa-4.3.1/_install/* _install
cd _install
(进去后只有opt目录,如果有其他目录说明之前操作有误)
tar cf bluez-alsa.tar opt

第三节 板子和蓝牙音箱配对并播放wav声音文件

【在板子上安装bluez-5.66和bluez-alsa-4.3.1】
tar xf bluez.tar -C /
tar xf bluez-alsa.tar -C /

addgroup -S audio
mkdir -p /opt/bluez-alsa/var/lib/bluealsa

找到20-bluealsa.conf文件所在的文件夹:find /opt -name 20-bluealsa.conf
所在的文件夹是/opt/bluez-alsa/etc/alsa/conf.d。
修改/opt/bluez-alsa/share/alsa/alsa.conf文件,把这个文件夹添加到@hooks files数组里面(加上双引号):"/opt/bluez-alsa/etc/alsa/conf.d"。

export PATH=$PATH:/opt/bluez/bin:/opt/bluez-alsa/bin
export LD_LIBRARY_PATH=/opt/bluez/lib:/opt/bluez-alsa/lib

【启动蓝牙后台进程】
insmod /root/test/modules/aic_btusb.ko
rm /opt/bluez/var/run/dbus/pid
/opt/bluez/bin/dbus-daemon --system
/opt/bluez/libexec/bluetooth/bluetoothd &
export $(/opt/bluez/bin/dbus-launch)
/opt/bluez/libexec/bluetooth/obexd &
/opt/bluez/bin/hciconfig hci0 up
export DBUS_SYSTEM_BUS_ADDRESS=unix:path=/opt/bluez/var/run/dbus/system_bus_socket
/opt/bluez-alsa/bin/bluealsa -p a2dp-source &

【连接蓝牙音箱并播放声音】
扫描、配对、连接蓝牙音箱:
bluetoothctl scan on
(命令执行后,等待扫描到蓝牙音箱,然后按Ctrl+C退出扫描)
bluetoothctl pair DC:D8:7C:1E:CA:CD
bluetoothctl trust DC:D8:7C:1E:CA:CD
bluetoothctl connect DC:D8:7C:1E:CA:CD
如果提示Failed to connect: org.bluez.Error.Failed br-connection-page-timeout,说明连接失败,重启一下蓝牙音箱再试试。

获取板载扬声器音量:amixer sget "DAC LINEOUT"
设置板载扬声器音量:amixer sset "DAC LINEOUT" 80%
用板子上的扬声器播放wav音频文件:aplay /root/music/wav/Sand.wav

获取蓝牙耳机播放音量:amixer -D bluealsa:SRV=org.bluealsa,DEV=DC:D8:7C:1E:CA:CD sget A2DP
设置蓝牙耳机播放音量:amixer -D bluealsa:SRV=org.bluealsa,DEV=DC:D8:7C:1E:CA:CD sset A2DP 15%
通过蓝牙耳机播放wav音频文件:aplay -D bluealsa:SRV=org.bluealsa,DEV=DC:D8:7C:1E:CA:CD,PROFILE=a2dp /root/music/wav/Sand.wav

【常见问题】
bluealsa: E: Couldn't obtain D-Bus connection: Could not connect: No such file or directory
解决方案:export DBUS_SYSTEM_BUS_ADDRESS=unix:path=/opt/bluez/var/run/dbus/system_bus_socket

bluealsa: W: Couldn't create storage directory: No such file or directory
解决方案:mkdir -p /opt/bluez-alsa/var/lib/bluealsa 

bluealsa: W: Couldn't get managed objects: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.bluez was not provided by any .service files
解决方案:先启动bluetoothd和obexd这两个进程,打开蓝牙设备(hciconfig hci0 up),然后再启动bluealsa进程。
报这个错说明bluetoothd都没启动,就尝试启动bluealsa。

ALSA lib pcm.c:2722:(snd_pcm_open_noupdate) Unknown PCM bluealsa:SRV=org.bluealsa,DEV=DC:D8:7C:1E:CA:CD,PROFILE=a2dp
aplay: main:850: audio open error: No such file or directory
解决方案:找到20-bluealsa.conf文件所在的文件夹:find /opt -name 20-bluealsa.conf
所在的文件夹是/opt/bluez-alsa/etc/alsa/conf.d。
修改/opt/bluez-alsa/share/alsa/alsa.conf文件,把这个文件夹添加到@hooks files数组里面(加上双引号):"/opt/bluez-alsa/etc/alsa/conf.d"。

ALSA lib dlmisc.c:339:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_bluealsa.so (libdbus-1.so.3: cannot open shared object file: No such file or directory)
aplay: main:850: audio open error: No such device or address
解决方案:将下面6个库文件放到/opt/bluez-alsa/lib/alsa-lib/里面。
libasound_module_ctl_bluealsa.a   libasound_module_pcm_bluealsa.a
libasound_module_ctl_bluealsa.la  libasound_module_pcm_bluealsa.la
libasound_module_ctl_bluealsa.so  libasound_module_pcm_bluealsa.so

dbus[372]: Unknown group "audio" in message bus configuration file
解决方案:执行addgroup -S audio命令添加一个名为audio的用户组。 

第四节 板子成为蓝牙耳机,和手机配对后,板载扬声器播放手机上的声音

先退出bluealsa后台进程:killall bluealsa
板子设为可发现,且允许配对:
bluetoothctl discoverable on
bluetoothctl pairable on

在手机上搜索名叫BlueZ 5.66的设备,点击配对。
配对成功后可以在板子上用bluetoothctl devices Paired命令看到手机的MAC地址。

[root@luckfox-rv1106 /]# bluetoothctl devices Paired
Device 84:D3:28:65:7E:E4 iPhone Oct1158
Device D8:CE:3A:72:37:CB Mi Phone 489
[root@luckfox-rv1106 /]#

板子启动bluealsa后台进程(注意是以a2dp-sink方式启动,这样板子才能成为一个蓝牙耳机):/opt/bluez-alsa/bin/bluealsa -p a2dp-sink &
板子启动bluealsa-aplay后台进程:/opt/bluez-alsa/bin/bluealsa-aplay --mixer-name="DAC LINEOUT" &

板子连接手机:bluetoothctl connect D8:CE:3A:72:37:CB

[root@luckfox-rv1106 /]# bluetoothctl connect D8:CE:3A:72:37:CB
Attempting to connect to D8:CE:3A:72:37:CB
[CHG] Device D8:CE:3A:72:37:CB Connected: yes
[NEW] Endpoint /org/bluez/hci0/dev_D8_CE_3A_72_37_CB/sep1
[NEW] Endpoint /org/bluez/hci0/dev_D8_CE_3A_72_37_CB/sep3
[NEW] Endpoint /org/bluez/hci0/dev_D8_CE_3A_72_37_CB/sep4
[NEW] Endpoint /org/bluez/hci0/dev_D8_CE_3A_72_37_CB/sep5
[NEW] Endpoint /org/bluez/hci0/dev_D8_CE_3A_72_37_CB/sep6
[NEW] Transport /org/bluez/hci0/dev_D8_CE_3A_72_37_CB/sep1/fd2
Connection successful
[root@luckfox-rv1106 /]#

连接成功后,手机上的BlueZ 5.66设备图标就显示成蓝牙耳机的样子了(也就是板子变成了一个蓝牙耳机了),手机上播放的声音就可以通过蓝牙转播到板子的扬声器上了。

获取板载扬声器音量:amixer sget "DAC LINEOUT"
设置板载扬声器音量:amixer sset "DAC LINEOUT" 40%
可在播放时调整音量。

在手机上打开抖音app,播放里面的视频,板子的扬声器就可以播放出手机里面的抖音的声音。
这个时候如果我们退出bluealsa-aplay后台进程,板载扬声器就会停止播放手机声音。
killall bluealsa-aplay
此时可以用arecord命令录制手机播放的声音到板子上的wav文件中。也就是手机播放的声音通过蓝牙转到板子上,但不通过板载扬声器播放出来,而是录制到wav文件中。
arecord -D bluealsa:SRV=org.bluealsa,DEV=D8:CE:3A:72:37:CB,PROFILE=a2dp -d 5 -f S32_LE -r 48000 -c 1 test.wav
其中,-d 5意思是录制5秒钟,-f S32_LE表示采样格式为32位有符号小端序,-r 48000表示采样率为48kHz,-c 1表示单声道采样。
手机必须要播放声音,否则不会计时。5秒钟时间到了之后,arecord进程自动退出,停止录音。这个时候控制台可能会打印bluealsa: E: PCM write error: Bad file descriptor,这个是正常现象。
录完后用板载扬声器播放出来:aplay test.wav
这种方法只能录到手机播放的声音,没有办法录到手机的麦克风采集到的声音。

板子断开与手机的连接,停止转播手机声音:bluetoothctl disconnect D8:CE:3A:72:37:CB
此时可关闭bluealsa-aplay后台进程:killall bluealsa-aplay