使用 Bluez 的 C/C++ BLE 读/写示例

Posted

技术标签:

【中文标题】使用 Bluez 的 C/C++ BLE 读/写示例【英文标题】:C/C++ BLE read/write example with Bluez 【发布时间】:2015-08-03 21:05:51 【问题描述】:

我开始使用微控制器和树莓派(tardis BLE 加密狗)构建一个简单的 BLE 网络。作为起点,我正在寻找一个简单的 C 或 C++ 示例来读取/写入 BLE 设备,类似于我能够通过命令行执行的操作。到目前为止,我发现的例子非常复杂。作为 BLE 初学者,我需要一些非常简单的示例来构建,然后再进行更复杂的设计。我可以像下面的 gatttool 示例中那样对 BLE 设备名称进行硬编码。

这是我目前使用 Bluez 命令行选项的方式。

从命令行我可以使用:

$ sudo hcitool lescan
LE Scan ...
BB:A0:50:02:18:07 MyDevice

接下来我可以在命令行上使用 gatttool 连接到设备:

$ sudo gatttol -b BB:A0:50:02:18:07 -I
[BB:A0:50:02:18:07][LE]> connect
Attempting to connect to BB:A0:50:02:18:07
Connection successful

我终于可以使用适当的句柄进行读写了

[BB:A0:50:02:18:07][LE]> char-write-req 000f 0100
Characteristic value was written successfully
[BB:A0:50:02:18:07][LE]> char-write-cmd 0011 4C467A

我用于初步研究和入门的一些网站:http://people.csail.mit.edu/albert/bluez-intro/c404.html https://github.com/carsonmcdonald/bluez-experiments/blob/master/experiments/scantest.c

【问题讨论】:

您还可以查看最新版本的 Bluez 发布的最新 DBUS GATT api(我认为是从 5.29 开始)。仍然是实验性的,但我已经做了一些测试,它工作得很好。当然性能可能比直接访问 bluez 库要低一些,但我认为值得一试... 【参考方案1】:

Bluez(Linux 官方蓝牙堆栈)的 API 已移至 DBUS。过去,“接受”“分叉”bluez 代码以访问 Linux 上的 BLE 支持,现在的方法是使用 DBUS。 Bluez DBUS API 记录在这里:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc

您可以直接与 DBUS 对话以获取蓝牙 C/C++ 应用程序,也可以使用 GATT 库作为助手。第二种可能是初学者的最佳方法(也适用于非初学者,他们更愿意让他们的程序 Bluez 不可知,例如支持其他操作系统或 Bluez pre-DBUS API 或使其源代码更具可读性)。

其中一个支持现代 D-BUS API 的 GATT 库是 gattlib(注意:我是这个库的作者)。 这是一个基于此库的简单示例,用于读取/写入 BLE 设备:https://github.com/labapart/gattlib/blob/master/examples/read_write/read_write.c

【讨论】:

@OliverM BlueZ DBUS API 严重不足且反应迟钝。这是来自真实的经验,许多电话挂断而没有成功返回。标准套接字 read() 方法是处理 HCI 的最有前途的方法。 @Ace 直接使用 HCI 意味着您在没有 DBUS 的情况下重写 Bluez,不是吗?向 Bluez 提供另一种传输协议而不是复制工作不是更快、更聪明吗?您很可能在我的回复中添加了“-1”,但以上所有答案并没有好多少 - 他们建议分叉 Bluez 以访问蓝牙。 DBUS 系统不仅在 C 之类的低级语言中操作起来非常复杂,而且在 BlueZ 中也很难接受。只需尝试导出一个简单的 DBUS LEAdvertisement1 对象,您就会明白我的意思(复杂性真的是 e^x)。套接字读取是最好的解决方案,尤其是对于实时嵌入式系统! Bluez DBUS LEAdvertisement1 仍处于试验阶段时,我已经完成了它的导出。我不记得它有多复杂,但我设法做到了。但这也是在 DBUS 上创建前端对降低复杂性有意义的原因。我没有必要不同意套接字 API。但是重新实现 Bluez 和添加套接字传输布局(除了 DBUS 一个)是有区别的。您可能知道编写基于 HCI 的库也不是一件容易的事。 @OlivierM 你的答案在 2021 年仍然有意义吗?我想用 c++ 在我的树莓派上创建 ble 外围设备,你推荐的东西应该可以正常工作吗?【参考方案2】:

简单的东西?一根绳子有多短?我个人认为 gatttool 代码本身很简单,可以按照自己的目的进行跟踪和提取(我最近做过)。但如果这真的不适合你,那么另一个选择是libgatt。它本质上与 gatttool 使用的代码相同,但更方便地捆绑到公共库 API 中。看看gatt.h,它具有连接/读/写等功能。希望它应该如何使用它是不言而喻的。

【讨论】:

感谢您的回复。 gatttool.c 和 gatt.c 似乎有我需要的东西。你能澄清一下 GAttrib 应该是什么吗?例如,采取命令行操作写入,char-write-cmd,我有一个已知的MAC地址、句柄和值要发送。我想使用 gatt.c 中的 gatt_write_cmd() 函数并简单地传入一组已知值,但我被困在 GAttrib 指针以及它与我在命令行选项中使用的内容之间的关系。 gatttool.c 和 gatt.c 在哪里?如何下载等?

以上是关于使用 Bluez 的 C/C++ BLE 读/写示例的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bluez5.50 使用 BLE 连接加密数据

使用 bluez 5.43 和 DBus 从 BLE 传感器读取广告数据包的正确方法是啥

BlueZ D-Bus C,应用程序BLE

Bluez BLE 连接监控使用 DBUS-Python

有没有办法增加 BlueZ 中的 BLE 广告频率?

BlueZ D-Bus C , 应用 BLE