Bluez作為目前最成熟的開源藍牙協定棧,在Linux的各大發行版中已經得到了廣泛的應用。在桌面環境下,使用Bluez應該已經沒有太大的問題,本文的主要目的是介紹在嵌入式平台上,搭建和配置Bluez的各個Profile運作所需做的工作,讨論可能遇到的問題,介紹一些工具的使用和工作原理。因為本人的能力和測試時間有限,可能下文中有些了解、分析不一定準确,歡迎聯系指正。
1 相關說明
1.1 bluez與bluez-libs,bluez-utils之間的關系
bluez可以算是bluez-libs和bluez-utils的整合,但是bluez裡面的工具更多一些。
1.2 網站資源
Bluez的官方網址:https://www.kernel.org/pub/linux/bluetooth/ 這裡提供最新的源碼下載下傳,最近伺服器崩潰了一次,有些東西沒了。。。。
Bluez的Wiki:http://www.linuxfromscratch.org/blfs/view/svn/general/bluez.html 這裡提供Bluez相關的Howto等文檔資源
1.3 依賴庫
glib-2.32.4
dbus-1.4.1
libical
2 編譯bluez-5.3
2.1 編譯glib-2.32.4
依賴庫檔案:
glib-2.32.4依賴于zlib,libffi,libelf-0.8.13,是以編譯glib-2.32.4之前需要編譯好依賴庫。
2.1.1 編譯zlib
zlib-1.2.5:http://download.csdn.net/detail/pengrui18/9711468
#!/bin/sh
./configure --prefix=$PWD/build
sed -i 19s/gcc/arm-linux-gnueabihf-gcc/g Makefile
sed -i 30s/gcc/arm-linux-gnueabihf-gcc/g Makefile
sed -i 31s/gcc/arm-linux-gnueabihf-gcc/g Makefile
sed -i 39s/ar/arm-linux-gnueabihf-ar/g Makefile
sed -i 40s/ranlib/arm-linux-gnueabihf-ranlib/g Makefile
sed -i 41s/ldconfig/arm-linux-gnueabihf-ldconfig/g Makefile
make&&make install
2.1.2 編譯libffi
libffi-3.0.10:http://download.csdn.net/detail/pengrui18/9711532
#!/bin/sh
./configure --prefix=$PWD/build
make&&make install
2.1.3 編譯libelf-0.8.13
libelf-0.8.13:http://download.csdn.net/detail/pengrui18/9711543
#!/bin/sh
./configure --host=arm-linux-gnueabihf --prefix=$PWD/build
sed -i 35s/gcc/arm-linux-gnueabihf-gcc/g Makefile
sed -i 29s/gcc/arm-linux-gnueabihf-gcc/g lib/Makefile
sed -i 31s/ar/arm-linux-gnueabihf-ar/g lib/Makefile
sed -i 35s/ranlib/arm-linux-gnueabihf-ranlib/g lib/Makefile
sed -i 27s/gcc/arm-linux-gnueabihf-gcc/g po/Makefile
make && make install
2.1.4 編譯glib-2.32.4
glib-2.32.4:http://download.csdn.net/detail/pengrui18/9711465
#!/bin/sh
echo "glib_cv_stack_grows=no">config.cache
echo "glib_cv_uscore=no">>config.cache
echo "ac_cv_func_posix_getpwuid_r=yes">>config.cache
echo "ac_cv_func_posix_getgrgid_r=yes">>config.cache
echo "ac_cv_lib_rt_clock_gettime=no">>config.cache
echo "glib_cv_monotonic_clock=yes">>config.cache
#add this line "AC_DEFINE(STDC_HEADERS,1,[Define to include stddef.h])" before AC_CHECK_ALIGNOF
sed -i '/AC_CHECK_ALIGNOF/i\AC_DEFINE(STDC_HEADERS,1,[Define to include stddef.h])' configure.ac
#更新configure檔案
autoconf
./configure --host=arm-linux-gnueabihf --prefix=$PWD/build -cache-file=config.cache \
ZLIB_CFLAGS="-I$PWD/../zlib-1.2.5/build/include" \
ZLIB_LIBS="-L$PWD/../zlib-1.2.5/build/lib -lz" \
LIBFFI_CFLAGS="-I$PWD/../libffi-3.0.10/build/lib/libffi-3.0.10/include" \
LIBFFI_LIBS="-L$PWD/../libffi-3.0.10/build/lib -lffi" \
LIBELF_CFLAGS="-I$PWD/../libelf-0.8.13/build/include" \
LIBELF_LIBS="-L$PWD/../libelf-0.8.13/build/lib -lelf"
make && make install
2.2 編譯dbus-1.4.1
dbus-1.4.1依賴expat-2.0.1
2.2.1 編譯expat-2.0.1
expat-2.0.1:http://download.csdn.net/detail/pengrui18/9711546
#!/bin/sh
./configure --prefix=$PWD/build --host=arm-linux-gnueabihf
make && make install
2.2.2 編譯dbus-1.4.1
dbus-1.4.1:http://download.csdn.net/detail/pengrui18/9711533
#!/bin/sh
./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc \
CFLAGS=-I$PWD/../expat-2.0.1/build/include \
LDFLAGS=-L$PWD/../expat-2.0.1/build/lib \
--prefix=$PWD/build --enable-abstract-sockets --with-x=no
make && make install
#需要将--prefix=$PWD/build參數去掉重新編譯,然後将bin目錄下的所需檔案拷貝過來
2.3 編譯libical-2.0.0
libical-2.0.0:http://download.csdn.net/detail/pengrui18/9711536
#!/bin/sh
mkdir build &&
cd build &&
#cmake -DCMAKE_INSTALL_PREFIX=/usr \
# -DCMAKE_BUILD_TYPE=Release \
# -DSHARED_ONLY=yes \
# .. &&
export CC=arm-linux-gnueabi-gcc
export CXX=arm-linux-gnueabi-g++
cmake -DCMAKE_INSTALL_PREFIX=$PWD/build
#将libstdc++庫檔案拷貝過來,否則報錯
cp -a /home/pengrui/my-imx6/02_source/imx-3.14.52_1.0.o_ga/tools/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/lib/libstdc++* lib/
make&&make install
2.4 編譯bluez-5.3
bluez-5.3依賴于readline,而readline依賴于ncurses
2.4.1 編譯ncurses-5.8
ncurses-5.8:http://download.csdn.net/detail/pengrui18/9711540
#!/bin/sh
./configure --host=arm-linux-gnueabihf --prefix=$PWD/build --with-shared
make && make install
2.4.2 編譯readline-6.3
readline-6.3:http://download.csdn.net/detail/pengrui18/9711530
#!/bin/sh
sed -i '6324s/yes/no/g' configure
./configure --host=arm-linux-gnueabihf --prefix=$PWD/build
make all&&make install
2.4.3 編譯bluez-5.3:
bluez-5.3:http://download.csdn.net/detail/pengrui18/9711539
#!/bin/sh
./configure --host=arm-linux-gnueabihf --prefix=$PWD/build --disable-usb --disable-udev --disable-systemd --disable-obex \
--with-dbusconfdir=$PWD/../dbus-1.4.1/build/etc \
--with-dbussystembusdir=$PWD/../dbus-1.4.1/build/share/dbus-1/system-services \
--with-dbussessionbusdir=$PWD/../dbus-1.4.1/build/share/dbus-1/services \
GLIB_CFLAGS="-I$PWD/../glib-2.32.4/build/include/glib-2.0 \
-I$PWD/../glib-2.32.4/build/lib/glib-2.0/include" \
GLIB_LIBS="-L$PWD/../glib-2.32.4/build/lib -lglib-2.0 -lgobject-2.0" \
GTHREAD_CFLAGS="-I$PWD/../glib-2.32.4/build/include/glib-2.0/glib" \
GTHREAD_LIBS="-L$PWD/../glib-2.32.4/build/lib -lgthread-2.0" \
DBUS_CFLAGS="-I$PWD/../dbus-1.4.1/build/include/dbus-1.0 -I$PWD/../dbus-1.4.1/build/lib/dbus-1.0/include" \
DBUS_LIBS="-L$PWD/../dbus-1.4.1/build/lib -ldbus-1" \
ICAL_CFLAGS="-I$PWD/../libical-2.0.0/build/include" \
ICAL_LIBS="-L$PWD/../libical-2.0.0/build/lib/arm-linux-gnueabihf" \
CFLAGS="-I$PWD/../readline-6.3/build/include -I$PWD/../libffi-3.0.10/build/lib/libffi-3.0.10/include" \
LDFLAGS="-L$PWD/../ncurses-5.8/build/lib -lncurses -L$PWD/../readline-6.3/build/lib -L$PWD/../libffi-3.0.10/build/lib -lffi"
make && make install
3.運作bluetoothctl指令
啟動dbus
啟動bluetoothd
如果在啟動bluetoothctl時提示No default controller available,則啟動bluetoothd失敗或者沒有啟動
Bluetoothctl
通過指令行配對是最可靠的選擇。準确的配對過程依不同裝置類型及其所提供的輸入功能而各不相同。下面提供使用/usr/bin/bluetoothctl配對的一般過程:
啟動 bluetoothctl 互動指令。可以輸入 help 列出所有有效的指令。
輸入power on 指令打開控制器電源。預設是關閉的。
輸入devices 指令擷取要配對裝置的 MAC 位址。
如果裝置未在清單中列出,輸入 scan on 指令設定裝置發現模式。
輸入agent on 指令打開代理。
輸入 pair MAC Address 開始配對(支援 tab 鍵補全)。
如果使用無 PIN 碼裝置,再次連接配接可能需要手工認證。輸入 trust MAC Address 指令。
最後,用 connect MAC_address 指令建立連接配接。
以下為一個互動執行個體:
# bluetoothctl
[NEW] Controller 00:10:20:30:40:50 pi [default]
[bluetooth]# agent KeyboardOnly
Agent registered
[bluetooth]# default-agent
Default agent request successful
[bluetooth]# scan on
Discovery started
[CHG] Controller 00:10:20:30:40:50 Discovering: yes
[NEW] Device 00:12:34:56:78:90 myLino
[CHG] Device 00:12:34:56:78:90 LegacyPairing: yes
[bluetooth]# pair 00:12:34:56:78:90
Attempting to pair with 00:12:34:56:78:90
[CHG] Device 00:12:34:56:78:90 Connected: yes
[CHG] Device 00:12:34:56:78:90 Connected: no
[CHG] Device 00:12:34:56:78:90 Connected: yes
Request PIN code
[agent] Enter PIN code: 1234
[CHG] Device 00:12:34:56:78:90 Paired: yes
Pairing successful
[CHG] Device 00:12:34:56:78:90 Connected: no