一、前期准备:
Ubuntu 12.04
需要的包:
expat-2.0.1.tar.gz
dbus-1.4.1.tar.gz
glib-2.16.2.tar.gz
bluez-4.95.tar.gz
bluez-hcidump-2.5.tar
下载地址:http://download.youkuaiyun.com/detail/u011408697/8515323
说明:
expat-2.0.1.tar.gz,网上下载,用于解析 xml,编译 bluez-4.95.tar.gz 需要
dbus-1.4.1.tar.gz,网上下载,用于进程间通信,编译 bluez-4.95.tar.gz 需要
glib-2.16.2.tar.gz,网上下载,编译 bluez-4.95.tar.gz 需要
bluez-4.95.tar.gz,官网提供,这是 bluez 库文件、自带配置工具
bluez-hcidump-2.5.tar,官网提供,这是调试 hci 包、事件的工具,非必须
依赖关系:
bluez ─┬─ dbus ─── expat
└─ glib
bluez-hcidump
二、项目需求:
目前博主需要在嵌入式 ARM Linux 上使用蓝牙模块,开发板是“飞凌 OK6410”,蓝牙模块是 RTL8723A,是一款 Wifi 蓝牙二合一的模块。项目需要在开发板上移植蓝牙,并通过手机 App 与开发板实现数据通信。
关于蓝牙数据通信,可以使用蓝牙传文件,也可以直接传数据,用到的是“蓝牙串口 SPP(Serial Port Protocol)”服务。
因此,对于 bluez-4.95,博主仅需要它的“蓝牙串口 SPP”服务,其他的像是蓝牙拨号上网、蓝牙鼠标键盘等等服务,都在交叉编译 configure 阶段裁剪掉了,关于 bluez-4.95 的 configure 参数,下文将会说明。
三、配置过程:
注:下文命令中选项中的两个减号,由于博客编辑器的限制,显示成了一个减号,注意不要直接复制粘贴!
1、交叉编译 expat-2.0.1:
./configure –prefix=/usr/local/bluez-4.95 –host=arm-linux CC=arm-linux-gcc
make
make install
2、交叉编译 dbus-1.4.1:
./configure \
–prefix=/usr/local/bluez-4.95 \
–host=arm-linux \
–with-x=no \
–enable-abstract-sockets \
CC=arm-linux-gcc \
CFLAGS=-I/usr/local/bluez-4.95/include \
LDFLAGS=-L/usr/local/bluez-4.95/lib
make
make install
3、交叉编译 glib-2.16.2:
./configure \
–prefix=/usr/local/bluez-4.95 \
–host=arm-linux \
CC=arm-linux-gcc \
glib_cv_stack_grows=no \
glib_cv_uscore=yes \
glib_cv_have_qsort_r=yes \
ac_cv_func_posix_getpwuid_r=yes \
ac_cv_func_posix_getgrgid_r=yes
make
make install
可能报错 1:
You must have either have gettext support in your C library, or use the
GNU gettext library. (http://www.gnu.org/software/gettext/gettext.html)
解决:apt-get install gettext
可能报错 2:configure: error: Could not find a glib-genmarshal in your PATH
注:缺少命令 glib-genmarshal,去下个 dev 包
解决:apt-get install libglib2.0-dev
可能报错 3:(当使用 glib-2.16.0 时)
gtester.c: In function ‘launch_test_binary’:
gtester.c:276: error: ‘ARG_MAX’ undeclared (first use in this function)
gtester.c:276: error: (Each undeclared identifier is reported only once
gtester.c:276: error: for each function it appears in.)
gtester.c:276: warning: unused variable ‘argv’
注:这是 glib-2.16.2 以前的 bug,在官方 2.16.1 to 2.16.2 中 fix 了,所以推荐使用 glib-2.16.2.tar.gz
4、交叉编译 bluez-4.95:
export PKG_CONFIG_LIBDIR=/usr/local/bluez-4.95/lib/pkgconfig
./configure \
–prefix=/usr/local/bluez-4.95 \
–host=arm-linux \
–disable-audio \
–enable-network \
–enable-serial \
–enable-input \
–enable-service \
–enable-health \
–enable-usb \
–enable-tools \
–enable-bccmd \
–enable-hid2hci \
–enable-hidd \
–enable-pand \
–enable-cups \
–enable-test \
CC=arm-linux-gcc \
CFLAGS=-I/usr/local/bluez-4.95/include \
LDFLAGS=-L/usr/local/bluez-4.95/lib
make
make install
复制源码 test/ 下 agent 文件到 prefix 指定的文件夹下的 bin/ 中,这个文件是蓝牙配对的密码代理程序。
注:前文也说了,博主仅需要“蓝牙串口 SPP”服务,其他的裁剪掉了,具体参数说明如下:
1、sap:sim 卡接入配置文件,sap 允许带有内置 gsm 收发器的车载电话之类的设备连接到蓝牙电话中的 sim 卡,因此车载电话本身并不需要单独的 sim 卡(以上来自网上,没懂),configure 可以不要;
2、alsa:声卡驱动,configure 可以不要;
3、gatt:表示服务器属性和客户端属性,描述了属性服务器中使用的服务层次、特点和属性,BLE 设备使用它作为蓝牙低功耗应用规范的服务发现。也就是说,这是蓝牙 4.0 BLE(低功耗)才有的,configure 可以不要;
4、bcsp:BlueCore Serial Protocol,是 Bluetooth 设备和系统之间传输 HCI 数据分组的可用协议的一种,BCSP 专用于基于 CSR BlueCore 芯片的非 USB 设备上,包括 PCMCIA 和 CF 卡,因此 configure 中 pcmcia 那个也可以不要;
5、pnat:貌似是通过蓝牙控制 at 命令打电话,和 dun 类似??configure 可以不要;
6、hid:蓝牙人机交互协议,可用来接蓝牙鼠标键盘,configure 先保留;
7、pan:蓝牙个人局域网,configure 先保留;
8、dun:蓝牙拨号上网,configure 可以不要;
9、cups:可能也许大概跟蓝牙打印机有关,configure 先保留。
5、交叉编译 bluez-hcidump-2.5:
./configure –prefix=/usr/local/bluez-4.95 –host=arm-linux CC=arm-linux-gcc
make
make install
四、使用方法:
1、把刚刚交叉编译好的 bluez-4.95 复制到开发板上,比如放在 /usr/local/ 下
2、开发板上,vi /etc/passwd,在最后添加messagebus:x:500:500::/home/messagebus:/bin/sh,保存
3、添加环境变量:
export PATH=/usr/local/bluez-4.95/bin:$PATH
export PATH=/usr/local/bluez-4.95/sbin:$PATH
export LD_LIBRARY_PATH=/usr/local/bluez-4.95/lib:$LD_LIBRARY_PATH
4、运行 dbus-daemon –system
注:启动一次过后会生成某进程文件,以后再启用需要先删除它
rm /usr/local/bluez-4.95/var/run/dbus/pid
5、bluetoothd -f /usr/local/bluez-4.95/etc/bluetooth/main.conf
或者:直接 bluetoothd,默认会载入上边的 conf
或者:bluetoothd -nd 表示进入调试并且不后台执行
注:开启 bluetoothd 默认会 hci0 up
6、agent 1234
注:1234 是密码,暂时未知用途,个人猜想是连接别人时,别人输入的 pin 码(我胡扯的……)
五、使用说明:
按照上面的使用方法执行完,应该可以用手机配上对儿了,这说明基本移植成功,剩下就是使用的问题了,下面一点一点讲解:
1、bluez-4.95 工作原理:
编译 bluez-4.95 时,可以看到依赖于 dbus,这个 dbus 个人理解就是个本地服务器,用于进程间通信,它中转了蓝牙配对请求密码匹配部分,目的在于可以外部实现任意 GUI,实现响应配对请求。
dbus-daemon –system 就是启动 dbus 守护进程,默认进入后台执行,所以不需要加 & 符号,另外,不要运行 dbus-launch,这种启动方法虽然可以启动 dbus-daemon,但是用起来各种报错……
然后我们运行了 bluetoothd,这是蓝牙 bluez 的守护进程,必须运行它才能进行蓝牙相关的操作,值得说明的是,4.95 版是 bluetoothd,3.36 版是 hcid,2.25 版是 hcid、sdpd,每个版本都不一样……
其实这里还涉及到了那个 /usr/local/bluez-4.95/etc/bluetooth/main.conf,这是 bluetoothd 的配置文件,在其他版本中,这个文件的名字也不一样,内容也不一样,配置方法也不一样……好在 4.95 不需要特别关注它