1. 程式人生 > >【ARM】交叉編譯 bluez-4.95 步驟及使用方法

【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

說明:

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