我有一个装有几个自定义GATT服务的设备,我想编写一个Linux程序与它进行交互。经过一些搜索,我发现Linux使用BlueZ处理蓝牙LE协议。我使用的是带有BlueZ 5.35的Ubuntu 15.10,但我无法弄清如何从用户空间程序中使用此BlueZ。我无法找到任何API文档、教程、示例等内容。是否有可能使用此BlueZ堆栈来执行除连接具有默认服务的蓝牙设备之外的其他任务?如果可以,那么文档在哪里?(最好是C/C++ API,但在这一点上任何东西都可以)
我有一个装有几个自定义GATT服务的设备,我想编写一个Linux程序与它进行交互。经过一些搜索,我发现Linux使用BlueZ处理蓝牙LE协议。我使用的是带有BlueZ 5.35的Ubuntu 15.10,但我无法弄清如何从用户空间程序中使用此BlueZ。我无法找到任何API文档、教程、示例等内容。是否有可能使用此BlueZ堆栈来执行除连接具有默认服务的蓝牙设备之外的其他任务?如果可以,那么文档在哪里?(最好是C/C++ API,但在这一点上任何东西都可以)
请查看bluez源代码中的attrib/gatttool.c
。Gatttool是一个使用C“API”连接BTLE设备的命令行实用程序。虽然libbluetooth没有暴露GATT接口。
一个较新的替代gatttool的选择,也是另一个可学习的示例是btgatt-client,可以在tools/btgatt-client.c
中找到(使用--enable-experimental
配置编译蓝牙)。
除了C接口,bluez还集成了一个DBUS接口。bluetoothctl是使用DBUS接口的示例工具。bluetoothctl的代码可以在client/
中找到。
另一个使用bluez C接口的示例程序是Anki Drive SDK [3]。它将bluez GATT C接口打包到自己的库libbzle [4]中。在使用C接口时,在建立BTLE连接时必须连接套接字。gatttool通过GATT接口执行此操作,后者再使用glib iirc。但是您也可以使用系统调用(socket、connect等)执行此操作,例如在此处[5]中解释的那样。该文档还解释了:
不幸的是,目前没有官方的API参考可供参考,因此更好奇的读者建议下载并检查BlueZ源代码。
Gilbert Brault还从bluez [6]中提取了GATT接口,并链接到简陋的GATT接口doxygen文档[7],其中包含以下免责声明:
这是一个正在进行的工作,旨在记录所有重要的函数和数据结构。
Szymon Janc在2016年的嵌入式Linux大会[8]中做了一次名为“现代Linux上的蓝牙”的演讲,提供了一个很好的概述。他在42:00开始谈论未公开的C接口。但总体而言,他似乎推荐使用DBUS API(请参见45:30处的“提示”幻灯片)。一些DBUS文档可以在doc/gatt-api.txt
[9]中找到,并且可以在test/
中找到使用DBUS接口的Python示例。
希望这有所帮助。
[1] http://git.kernel.org/cgit/bluetooth/bluez.git/tree/attrib/gatttool.c
[2] http://git.kernel.org/cgit/bluetooth/bluez.git/tree/client/
[3] https://github.com/anki/drive-sdk/
[4] https://github.com/anki/drive-sdk/tree/master/deps/bzle/
[5] https://people.csail.mit.edu/albert/bluez-intro/c404.html
[6] https://github.com/gbrault/gattclient
[7] http://gbrault.github.io/gattclient/index.html
我理解你的痛苦。我需要将来自自定义BLE外设(一个简单的遥控按钮)的用户输入添加到在树莓派上运行的Linux(Stretch)下的嵌入式程序中。然而,我被 BlueZ API 的不必要的复杂性和匮乏的文档(这并不是恭维)震惊了。所有的 BlueZ “示例”都是从蓝牙是宇宙中心并且用户想要支持所有发明出来的蓝牙设备的角度编写的。但在我的情况下,我确切地知道了我需要与之交互的设备、服务和 GATT 特性,并且我希望有一个最小开销任务,在低优先级线程中完成其工作。
结果发现,使用BlueZ实现BLE中央客户端相当简单,但是这是一条艰辛的道路,从BlueZ实用程序bluetoothctl的源代码开始,该源代码在5.49版本发布中。我仅使用了来自BlueZ分发的三个未修改的源文件和另外三个源文件的摘录来满足我的需求。由于BlueZ源码与 D-Bus 和Gnome GLib主循环密不可分,所以我勉强包含了它们。
跟随OlivierM的慷慨帮助,并希望我的令人尴尬的大量时间投资能够为他人节省一个月的时间,我已经在GitHub上发布了我的示例蓝牙BLE客户端:https://github.com/jjjsmit/BluetoothBLEClient
如果您需要的功能只涉及到Linux操作系统,编写一个shell脚本可能会更加简单快捷。使用BlueZ命令相对简单直接,有许多教程和问题可以帮助您学习如何使用它。
教程:
http://www.jaredwolff.com/blog/get-started-with-bluetooth-low-energy/ https://learn.adafruit.com/reverse-engineering-a-bluetooth-low-energy-light-bulb/control-with-bluez https://lilyhack.wordpress.com/2014/02/03/ble-read-write-arduino-raspberry-pi/ http://joost.damad.be/2013/08/experiments-with-bluetooth-low-energy.html
问题:
一旦您熟悉手动使用命令,就可以编写一个最小的shell脚本,以便为您自动化此过程。
hcitool
、gatttool
。https://wiki.archlinux.org/title/bluetooth#Deprecated_BlueZ_tools - Raleigh L.我最近发现自Qt 5.7起,Qt具备了蓝牙低功耗主机支持。 Qt蓝牙低功耗。它可在LGPLv3或商业许可下使用,并提供C++ API。