【ARM】交叉编译 bluez-4.95 步骤及使用方法

来源:互联网 发布:淘宝评价管理 编辑:程序博客网 时间:2024/06/05 15:46

一、前期准备:

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.csdn.net/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 不需要特别关注它

0 0
原创粉丝点击