gattlib应用一(移植)

        最近项目使用到了君正的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移植完成接下来时是应用开发

未完待续.......

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: kfifo是Linux内核中一种用于缓冲数据的数据结构,用于协调生产者和消费者的操作。它通过环形队列的方式管理数据的读写,实现了高效的数据传输。 将kfifo移植应用层,可以实现在用户空间中也能利用kfifo提供的高效数据缓冲功能。 首先,我们需要在应用程序中引入kfifo的头文件,并将其编译进应用程序的代码中。 然后,我们可以通过以下步骤使用kfifo: 1. 初始化kfifo:使用kfifo_init函数进行初始化,指定缓冲区大小和数据类型。 2. 写入数据:使用kfifo_in函数将需要传输的数据写入到kfifo的缓冲区中。 3. 读取数据:使用kfifo_out函数从kfifo的缓冲区中读取需要的数据。 4. 判断缓冲区状态:使用kfifo_is_empty和kfifo_is_full函数可以判断缓冲区是否为空或已满。 通过移植kfifo到应用层,我们可以在用户空间中更灵活地使用这个高效的数据结构。我们可以在应用程序中使用kfifo来管理数据缓冲区,实现生产者和消费者之间的数据传输,并且可以根据需求进行扩展和修改。 总结起来,将kfifo移植应用层,可以提供一个高效的缓冲区管理方式,有助于提高应用程序的数据传输效率和性能。 ### 回答2: kfifo是Linux内核中用于实现无锁队列的一种数据结构。它具有高效、可靠和线程安全等优点,因此在应用层进行移植时也能发挥其特性。 首先,应用移植kfifo需要将kfifo的源代码从内核中提取出来,并进行相应的修改,以适应应用层的环境。这包括调整数据结构的定义和函数的接口,确保其与应用层代码的兼容性。 其次,在移植kfifo时,需要根据具体的应用场景和需求来调整kfifo的大小和配置。kfifo的大小应根据实际数据量进行设置,以充分利用内存资源并避免溢出或浪费。同时,还可以根据需要调整kfifo是否支持多线程并发操作。 在应用层中使用kfifo时,可以通过调用kfifo提供的接口来实现队列的入队和出队操作。这包括向kfifo中插入元素、从kfifo中获取元素以及获取队列的状态等。同时,还可以根据需要进行扩展,以满足具体应用场景的要求。 移植kfifo到应用层还需要注意线程安全性和并发控制。由于应用层可能存在多个线程同时对kfifo进行读写操作,因此需要增加适当的同步机制,如锁或原子操作,以确保数据的一致性和线程的安全。 总之,kfifo的移植应用层可以提供高效、可靠和线程安全的队列功能,适用于各种应用场景。但在移植过程中需要注意调整数据结构、接口和配置,并根据具体需求增加适当的扩展和并发控制机制,以提供更好的性能和可靠性。 ### 回答3: kfifo是Linux内核中的一个环形缓冲区实现,通常用于在内核中进行高效的数据传输。要将kfifo移植应用层,需要进行以下步骤: 1. 了解kfifo的基本原理:kfifo是一个循环队列,具有读写指针和缓冲区。数据按照FIFO(先进先出)原则在缓冲区中传输。 2. 将kfifo相关的头文件和源代码复制到应用程序的源代码目录中。 3. 修改kfifo源代码中与内核相关的部分,使其适应用户空间。这可能包括对内存分配函数和同步原语的更改。 4. 修改kfifo的接口,使其适应应用层的数据传输需求。对于内核中的kfifo,其接口可能是以IO操作的形式提供的,而在应用层中,可以使用API函数来替代。 5. 在应用层中,使用相应的API函数来初始化kfifo对象,并进行读写操作。注意,在应用层中需要自己实现同步机制来保证多线程环境下的数据一致性。 6. 根据应用程序的需求,对kfifo进行适当的修改和扩展。例如,可以添加自定义的数据类型,修改缓冲区大小,以及添加其他辅助函数。 7. 进行测试和调试,确保kfifo在应用层中能够正常工作。可以编写相应的测试代码来验证kfifo的正确性和性能。 总结起来,将kfifo移植应用层需要了解kfifo的原理和接口,进行必要的修改和调整,并进行测试和调试以保证其正常工作。移植后的kfifo可以在应用层中用于高效的数据传输和缓冲处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值