Linux API下的蓝牙低功耗技术

18

我有一个装有几个自定义GATT服务的设备,我想编写一个Linux程序与它进行交互。经过一些搜索,我发现Linux使用BlueZ处理蓝牙LE协议。我使用的是带有BlueZ 5.35的Ubuntu 15.10,但我无法弄清如何从用户空间程序中使用此BlueZ。我无法找到任何API文档、教程、示例等内容。是否有可能使用此BlueZ堆栈来执行除连接具有默认服务的蓝牙设备之外的其他任务?如果可以,那么文档在哪里?(最好是C/C++ API,但在这一点上任何东西都可以)


是的,这是可能的。但需要一定的学习曲线。bluez API在bluez tree中有文档记录。它们都是DBUS API。因此,要使用它们,您首先需要了解一些关于DBUS的知识。有不同的绑定可用于利用DBUS。它们包括Python、Glib和QT。还有其他的。 - kaylum
这里的每个人都谈论LE Client作为Linux,没有人谈论Linux LE作为服务器。 - Raulp
5个回答

17
  • 请查看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

[8] https://www.youtube.com/watch?v=tclS9arLFzk是一段关于Google的机器学习项目TensorFlow的视频介绍。TensorFlow是一种开源的人工智能软件库,可用于创建和训练各种机器学习模型。
[9] http://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/gatt-api.txt是一个关于蓝牙低功耗(Bluetooth Low Energy)的文档,它提供了有关蓝牙设备通信协议的详细信息,包括连接、服务、特征和描述符等方面的内容。

16

我理解你的痛苦。我需要将来自自定义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


6

如果您需要的功能只涉及到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脚本,以便为您自动化此过程。


2
我已经使用了很多这些命令来测试BlueZ的功能,它具备我需要的特性。但是我需要创建比shell脚本更复杂的东西。 - UnTraDe
其中一些文章提到了现在在Linux上已经被弃用的工具,比如hcitoolgatttool。https://wiki.archlinux.org/title/bluetooth#Deprecated_BlueZ_tools - Raleigh L.

2
我遇到了一个类似的问题,需要使用GATT C/C++ API与BLE设备进行交互。我意识到并没有现成的API可以使用。我解决问题的方式是编写了自己的GATT库,并将代码上传至Github:https://github.com/labapart/gattlib
我在自己的BLE项目中使用这个库,它满足了我的需求。我创建了一些示例https://github.com/labapart/gattlib/tree/master/examples,使用该库鼓励人们使用它并获得更好的反馈。

1

我最近发现自Qt 5.7起,Qt具备了蓝牙低功耗主机支持。 Qt蓝牙低功耗。它可在LGPLv3或商业许可下使用,并提供C++ API。


我希望能够找到一些使用这个API的开源程序。我尝试在一个程序中使用它,但是却遇到了无法解释的崩溃问题。例如连接到一个设备并读取服务,然后断开连接再连接到另一个设备就会导致崩溃。此外,我发现我必须强制使用特定的蓝牙DBus版本,否则命令无法正确地发送和接收到设备。例如,请参见:https://forum.qt.io/topic/122098/qt-bluetooth-low-energy-notification-bug-downgrade-qt。问题是除了Qt示例之外,我找不到任何更复杂的程序来使用它。 - Sandro4912

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接