在Linux上的蓝牙低功耗API

问题描述:

我有一个有几个定制GATT服务的设备,我想编写一个Linux程序来与它交互。经过一番搜索后,我发现Linux正在使用BlueZ来处理蓝牙LE协议。我在BlueZ 5.35上使用了Ubuntu 15.10,但我无法弄清楚如何在用户空间程序中使用这个BlueZ。我无法在任何地方找到API文档,没有教程,示例,也没有。除了只使用默认服务连接到蓝牙设备之外,是否有可能使用此BlueZ堆栈来做其他任何事情?如果是这样,文档在哪里? (最好是C/C++ API,但在这一点上什么都行)在Linux上的蓝牙低功耗API

+0

是的,这是可能的。但是有一条学习曲线。 bluez APIS记录在[bluez树](https://github.com/r10r/bluez/blob/master/doc/)中。这些都是DBUS API。所以要使用它们,你首先需要了解一下DBUS。使用DBUS有不同的绑定。它们包括python,Glib和QT。还有其他人。 – kaylum

在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脚本,以便为您自动执行这些脚本。

+1

我已经使用了很多这些命令来测试BlueZ的功能,并且它具有我需要的功能。但我需要创建比shell脚本更复杂的东西。 – UnTraDe

我有一个类似的问题,就是用GATT C/C++ API与BLE设备进行交互。我意识到没有这样的API存在。 我解决我的问题的方式是编写我自己的GATT库。我在Github上推送了代码:https://github.com/labapart/gattlib

我在我自己的BLE项目中使用这个库,它满足我的需求。我创建了几个例子https://github.com/labapart/gattlib/tree/master/examples,它们使用库来鼓励人们使用它并获得更好的反馈。

看看蓝色光源中的attrib/gatttool.c [1]。 Gatttool是一个命令行工具,用于使用C“API”连接BTLE设备。尽管如此,GATT界面并未在libbluetooth中公开。一个更新的替代gatttool,因此另一个可以学习的例子是btgatt-client,您可以在tools/btgatt-client.c中找到它(使用--enable-experimental启用编译配置bluez)。除了C接口bluez集成了一个DBUS接口。 bluetoothctl是使用DBUS接口的示例工具。 bluetoothctl的代码可以在client/ [2]中找到。另一个使用bluez的C接口的示例程序是Anki Drive SDK [3]。它将bluez GATT C接口封装在自己的库libbzle中[4]。使用C接口时,建立BTLE连接时必须连接套接字。 gattool通过GATT界面来完成这个操作,而GATT界面又使用了glib iirc。但是,您也可以使用syscalls(socket,connect,...)来解决这个问题。这里[5]。此文档还解释:

不幸的是,截至目前还没有官方的API参考文献可供参考,因此建议更多好奇的读者下载并检查BlueZ源代码。

吉尔伯特Brault还提取到GATT接口[7]与下面的免责声明的一个基本Doxygen文档从的bluez [6]和链接关贸总协定接口:

这是正在进行的工作与记录所有重要功能和数据结构的意图

另外Szymon Janc在2016年嵌入式Linux大会上他的演讲“现代Linux上的蓝牙”中给出了一个很好的概述[8]。从42:00开始,他谈到了未曝光的C界面。但总的来说,他似乎推荐使用DBUS API(请参阅45:30“提示”幻灯片)。一些DBUS文档可以在doc/gatt-api.txt [9]中找到,使用DBUS接口的Python示例可以在test/中找到。

希望这会有所帮助。

[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
[9] http://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/gatt-api.txt