最近项目使用到了君正的x2000平台的蓝牙功能,前期已经按照君正的sdk文档完成了驱动适配,使用bluez工具进行了各项蓝牙测试。但是我想在自己的应用中使用到蓝牙scan connect disconnect read/write等功能管理多个ble设备,光靠命令完成测试还远远不行。总结了一下网上各个大佬的方案,大多数选择使用Dbus (bluez 5.0之后的API已经移至Dbus上),使我们的上层应用直接与dbus对话。可以参考这个文档https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc
但是对于初学者而言,我更推荐使用gatt库来调用连接使用D-bus的 API。gattlib是支持现代d-bus api的gatt库之一,里面有几个简单案例可以参考使用并完成使用ble的功能,这是一个简单的ble设备读写连接:https://github.com/labapart/gattlib/blob/master/examples/read_write/read_write.c
- 代码准备
https://github.com/labapart/gattlib 下载代码库解压
如果编译环境没有安装gbus 需要自己提前安装 否则编译不过 安装命令如下
apt-get install libdbus-glib-1-dev
- 交叉编译,我使用的是君正x2000平台,系统sdk已经提前编译好。
进入解压目录建立build文件夹,配置 CROSS_COMPILE 与 SYSROOT环境变量 设置交叉编译工具集
cd <gattlib-src-root>
mkdir build && cd build
export CROSS_COMPILE=~/sdk_x2000/x2000/buildroot/buildroot/output/host/bin/mips-linux-gnu-
export SYSROOT=~/sdk_x2000/x2000/buildroot/buildroot/output/
cmake ..
make
注:交叉编译工具集需要根据自己的编译环境路径配置。如果发现配置错误需要重新修改环境变量,需要清空build目录下的文件重新执行cmake ..命令
如下则是sysroot 变量配置错误的编译提示
/mips-linux-gnu/bin/ld: cannot find crt1.o: No such file or directory
正确配置好交叉编译工具后编译成功会生成动态库libgattlib.so 和几个测试案例
[ 2%] Generate D-Bus 'org.bluez.Battery1.xml'
[ 5%] Generate D-Bus 'org.bluez.Adapter1.xml'
[ 7%] Generate D-Bus 'org.bluez.Device1.xml'
[ 10%] Generate D-Bus 'org.bluez.GattCharacteristic1.xml'
[ 12%] Generate D-Bus 'org.bluez.GattDescriptor1.xml'
[ 15%] Generate D-Bus 'org.bluez.GattService1.xml'
Scanning dependencies of target gattlib
[ 17%] Building C object dbus/CMakeFiles/gattlib.dir/gattlib.c.o
[ 20%] Building C object dbus/CMakeFiles/gattlib.dir/gattlib_adapter.c.o
[ 23%] Building C object dbus/CMakeFiles/gattlib.dir/gattlib_advertisement.c.o
[ 25%] Building C object dbus/CMakeFiles/gattlib.dir/gattlib_char.c.o
[ 28%] Building C object dbus/CMakeFiles/gattlib.dir/gattlib_notification.c.o
[ 30%] Building C object dbus/CMakeFiles/gattlib.dir/gattlib_stream.c.o
[ 33%] Building C object dbus/CMakeFiles/gattlib.dir/bluez5/lib/uuid.c.o
[ 35%] Building C object dbus/CMakeFiles/gattlib.dir/__/common/gattlib_common.c.o
[ 38%] Building C object dbus/CMakeFiles/gattlib.dir/__/common/gattlib_eddystone.c.o
[ 41%] Building C object dbus/CMakeFiles/gattlib.dir/__/common/logging_backend/syslog/gattlib_logging.c.o
[ 43%] Building C object dbus/CMakeFiles/gattlib.dir/org-bluez-adaptater1.c.o
[ 46%] Building C object dbus/CMakeFiles/gattlib.dir/org-bluez-device1.c.o
[ 48%] Building C object dbus/CMakeFiles/gattlib.dir/org-bluez-gattcharacteristic1.c.o
[ 51%] Building C object dbus/CMakeFiles/gattlib.dir/org-bluez-gattdescriptor1.c.o
[ 53%] Building C object dbus/CMakeFiles/gattlib.dir/org-bluez-gattservice1.c.o
[ 56%] Building C object dbus/CMakeFiles/gattlib.dir/org-bluez-battery1.c.o
[ 58%] Linking C shared library libgattlib.so
[ 58%] Built target gattlib
Scanning dependencies of target advertisement_data
[ 61%] Building C object examples/advertisement_data/CMakeFiles/advertisement_data.dir/advertisement_data.c.o
[ 64%] Linking C executable advertisement_data
[ 64%] Built target advertisement_data
Scanning dependencies of target ble_scan
[ 66%] Building C object examples/ble_scan/CMakeFiles/ble_scan.dir/ble_scan.c.o
[ 69%] Linking C executable ble_scan
[ 69%] Built target ble_scan
Scanning dependencies of target discover
[ 71%] Building C object examples/discover/CMakeFiles/discover.dir/discover.c.o
[ 74%] Linking C executable discover
[ 74%] Built target discover
Scanning dependencies of target find_eddystone
[ 76%] Building C object examples/find_eddystone/CMakeFiles/find_eddystone.dir/find_eddystone.c.o
[ 79%] Linking C executable find_eddystone
[ 79%] Built target find_eddystone
Scanning dependencies of target read_write
[ 82%] Building C object examples/read_write/CMakeFiles/read_write.dir/read_write.c.o
[ 84%] Linking C executable read_write
[ 84%] Built target read_write
Scanning dependencies of target read_write_memory
[ 87%] Building C object examples/read_write_memory/CMakeFiles/read_write_memory.dir/read_write_memory.c.o
[ 89%] Linking C executable read_write_memory
[ 89%] Built target read_write_memory
Scanning dependencies of target notification
[ 92%] Building C object examples/notification/CMakeFiles/notification.dir/notification.c.o
[ 94%] Linking C executable notification
[ 94%] Built target notification
Scanning dependencies of target nordic_uart
[ 97%] Building C object examples/nordic_uart/CMakeFiles/nordic_uart.dir/nordic_uart.c.o
[100%] Linking C executable nordic_uart
[100%] Built target nordic_uart
- 测试案例
将build目录下会生libgattlib.so 和几个测试用例 下载到开发板上
因为测试案例会调用到动态库 libgattlib.so 我们可以将libgattlib.so cp到标准库的路径下,或者直接执行命令将当前路径添加到动态库搜索路径中。
export LD_LIBRARY_PATH=$pwd:$LD_LIBRARY_PATH
运行案例:
# export LD_LIBRARY_PATH=$pwd:$LD_LIBRARY_PATH
# ./ble_scan
Discovered 00:15:83:9D:92:47 - 'BT-TH-BATTERY0111'
Discovered 65:F3:DE:23:B4:F1
Discovered 1A:21:C8:1E:7C:D8
Discovered 55:0A:22:8B:A1:39
Discovered E0:B6:55:93:7D:68
Discovered 42:D1:47:81:EA:5C
Discovered 2A:6D:8B:1F:03:F3
Discovered 5B:7E:A8:58:EF:D4
Discovered 45:49:78:C8:76:63
Discovered 18:BC:5A:8C:D5:56
Discovered 7C:81:48:C7:02:BC
Discovered 67:3C:19:65:84:B1
Discovered 54:EB:3C:47:6D:09
Discovered 50:71:21:14:6A:4A - 'Mi Smart Band 5'
Discovered 6B:7E:E9:84:45:6C
Discovered 6E:09:17:E0:FD:1F
Discovered 4F:DF:90:DB:AC:F2
Discovered 46:F5:40:FC:38:EF
Discovered 58:65:DA:21:63:A5
Discovered 76:44:6C:95:90:32
Discovered 6D:CB:1D:44:95:84
Discovered 6C:2E:9E:63:20:B6
Discovered 79:D0:9F:8D:43:BD
Discovered 68:8E:07:75:80:63
Discovered C4:67:B5:75:AD:E7
Discovered 42:5B:B4:05:EB:9C
Discovered 6E:F8:4D:F5:17:F2
Discovered 58:F7:31:24:E8:4A
[82444.078565] Bluetooth: hci0 advertising data length corrected
Discovered 6A:07:25:D7:92:B0
Discovered 68:4F:34:24:17:02
Discovered 14:7D:DA:B2:85:35
Discovered 44:15:35:82:AB:0F
Discovered 43:56:2C:B6:A6:55
Discovered 5C:7E:7D:43:D8:ED
Discovered 7C:CE:32:81:4B:F1
Discovered 41:1C:AD:1F:8D:3C
Discovered 1E:80:86:ED:5E:D9
Discovered 43:36:81:80:86:9E
Discovered 4B:1D:54:D5:A6:37
Scan completed
gattlib移植完成接下来时是应用开发
未完待续.......