前言
bluez是嵌入式端的蓝牙工具,好像也没有其他的替代品(也可能是我没有找到)。如果有我可能会马上转向其他的工具了。因为bluez依赖的环境太多了,在电脑端编译一次就能通过。但是在嵌入式端各种库缺失,各种因为写法问题造成的编译报错。。。。不过最后还是在一个比较全的文章的参考下,加上各种尝试。完成了初步的编译,然后有一个初步的测试。
参考教程链接: 英文的.
准备工作
包下载地址,都在压缩包里面
https://download.youkuaiyun.com/download/eyhxh/13117821
这些包都是需要的,要特别注意版本,有好几个包不同版本的编译依赖都是不同的,编译时报的错误也不相同。没有一个详细的指导编译难度很大。当然必须说明一点,就是交叉编译的host系统也很重要,所以是很通用的平台,可能完全不会遇到这些错误。所以本文只是一个参考。
编译过程
因为是嵌入式编译,编译中间文件和库我都是放到_install目录中,这个方法其实挺不错的,不会影响到宿主机。
zlib
CC=aarch64-himix200-linux-gcc ./configure --shared --prefix=$(pwd)/../_install; make;
make install
libffi
./configure --host=aarch64-himix200-linux CC=aarch64-himix200-linux-gcc --prefix=$(pwd)/../_install
make;make install
glib
./configure --host=aarch64-himix200-linux \
--prefix=$(pwd)/../_install \
PKG_CONFIG_PATH=$(pwd)/../_install/lib/pkgconfig \
glib_cv_stack_grows=no \
glib_cv_uscore=yes \
ac_cv_func_posix_getpwuid_r=yes \
ac_cv_func_posix_getgrgid_r=yes
这里make会错误
用下面的代码包裹保存的报错的这个函数,其实就是把这个错误直接忽略掉!!!
//文件位置 ./glib/gdate.c文件中的 g_date_strftime()
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
//包住报错的函数g_date_strftime()
#pragma GCC diagnostic pop
然后make 错误
这个错误很好解决,上面其实libffi已经编译了,make install默认安装到了lib64文件,最简单的方法就是把lib64里面的库直接复制到lib中
再make ;make install 就成功了
expat
.
/configure --host=arm-linux CC=aarch64-himix200-linux-gcc --prefix=$(pwd)/../_install
make;make install
d-bus
./configure --host=arm-linux \
CC=aarch64-himix200-linux-gcc \
--prefix=$(pwd)/../_install \
PKG_CONFIG_PATH=$(pwd)/../_install/lib/pkgconfig \
CFLAGS=-I$(pwd)/../_install/include \
LDFLAGS=-L$(pwd)/../_install/lib
make LIBS="-lgmodule -lz -lffi" ;make install
make LIBS="-lgmodule -lz -lffi -glib" ;make install
# 某些时候需要这条
#make命令比较特别,shell命令中间有空格要用引号括起来,不然会被当然另一个参数了
ncurses
CPPFLAGS=-P ./configure --host=arm-linux \
CC=aarch64-himix200-linux-gcc \
CXX=aarch64-himix200-linux-g++ \
--prefix=$(pwd)/../_install \
make
make install
readline
./configure --host=arm-linux \
CC=aarch64-himix200-linux-gcc \
CXX=aarch64-himix200-linux-g++ \
--prefix=$(pwd)/../_install \
bash_cv_wcwidth_broken=yes \
--with-curses
make
make install
libical
mkdir build
cd build
export CC=aarch64-himix200-linux-gcc
export CXX=aarch64-himix200-linux-g++
cmake .. -DCMAKE_INSTALL_PREFIX=$(pwd)/../_install
make
make install
bluez
./configure --host=arm-linux \
CC=aarch64-himix200-linux-gcc \
--prefix=$(pwd)/../_install \
PKG_CONFIG_PATH=$(pwd)/../_install/lib/pkgconfig \
CFLAGS=-I$(pwd)/../_install/include \
LDFLAGS=-L$(pwd)/../_install/lib \
--disable-systemd \
--disable-udev \
--disable-cups \
--disable-obex \
--enable-library
make LIBS=-lncurses ;make install
简单使用
copy hciconfig文件到嵌入式的板子上。
/app # ./hciconfig -a #查看所有蓝牙设备
hci0: Type: BR/EDR Bus: USB
BD Address: A0:9F:10:08:9D:BB ACL MTU: 1021:8 SCO MTU: 255:12
DOWN
RX bytes:584 acl:0 sco:0 events:30 errors:0
TX bytes:369 acl:0 sco:0 commands:30 errors:0
Features: 0xff 0xff 0xff 0xfe 0xdb 0xfd 0x7b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH HOLD SNIFF PARK
Link mode: SLAVE ACCEPT
/app # ./hciconfig hci0 up #打开蓝牙设备
/app # ./hciconfig -a
hci0: Type: BR/EDR Bus: USB
BD Address: A0:9F:10:08:9D:BB ACL MTU: 1021:8 SCO MTU: 255:12
UP RUNNING
RX bytes:1168 acl:0 sco:0 events:60 errors:0
TX bytes:738 acl:0 sco:0 commands:60 errors:0
Features: 0xff 0xff 0xff 0xfe 0xdb 0xfd 0x7b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH HOLD SNIFF PARK
Link mode: SLAVE ACCEPT
Name: 'RTK_BT_4.1'
Class: 0x000000
Service Classes: Unspecified
Device Class: Miscellaneous,
HCI Version: 4.1 (0x7) Revision: 0x828a
LMP Version: 4.1 (0x7) Subversion: 0x930d
Manufacturer: Realtek Semiconductor Corporation (93)