天天看點

【ARM】交叉編譯 bluez-4.95 步驟及使用方法

一、前期準備:

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 不需要特别關注它