c++ - 带有 D-Bus BlueZ 的基本 BLE 客户端

标签 c++ bluetooth-lowenergy bluez gdbus

我正在使用(每个人最喜欢的)BlueZ 5.40 编译并运行实验性功能,我需要扫描 LE 设备,配对并连接到一个设备,并通过 D-Bus API 读/写特性。我研究了 hcitool、gatttool 和 bluetootctl 的源代码,并使用 GDBus 制作了一个基本应用程序。但是,它有几个问题。

  1. 扫描不添加/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX 对象。 org.bluez 总线的路径(使用 d-feet 检查)。考虑到它不是基于 D-Bus 的,这并不奇怪,但是当我使用 StartDiscovery 时,它根本没有检测到我的设备。 bluetoothctl 也没有。

之后,我使用 gatttool 和 simple-agent 作为解决方法来创建对象路径,然后使用我的程序进行连接,但我遇到了另一个问题:

  1. 当我尝试读取特征时,出现“连接已关闭 (18)”错误。我怀疑这与蓝牙设备之间的连接无关,它谈论的是 D-Bus 本身,因为当我尝试使用 SetDiscoveryFilter 仅为 LE 设备设置扫描过滤器时,我收到了同样的错误。

每当我只使用 Connect 和 Disconnect 功能时,一切似乎都工作正常,但用于此类应用程序的用途......有限。 所以我的问题是:

  1. 如何使用 GDBus 扫描 LE 设备?如果那不可能,如何手动添加设备或说服 bluetoothd 为我做这件事?

  2. 如何正确解读一个特征?

即使缩短后代码也相当冗长,所以我把它放到了 pastebin 上: http://pastebin.com/YNLMF0qC .
编译 g++ -std=c++11 $(pkg-config --cflags glib-2.0 gobject-2.0 gio-2.0) ./main.cpp $(pkg-config --libs glib-2.0 gobject-2.0 gio-2.0 bluez)

最佳答案

终于搞定了。
1.最近被BlueZ 5.41解决了。我的设备是“可扫描的”但不是“可发现的”。这意味着它广播了广告数据包,但因为它不允许没有 PIN 的连接来发现更多服务。在 BlueZ 5.41 中,如果您使用 SetDiscoveryFilter 设置任何过滤器,这些设备在扫描期间也会变得可见。这是最近对 https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/adapter-api.txt 添加的(一点也不直观!) :

When discovery filter is set, Device objects will be created as new devices with matching criteria are discovered regardless of they are connectable or discoverable which enables listening to non-connectable and non-discoverable devices.

  1. 纯粹是我的错误。正如我所说,我在 ReadValue 和 SetDiscoveryFilter 上遇到了同样的错误,但这个错误与 DBus 连接无关。这是由不正确的 GVariant 参数引起的。正确的形式是 "(a{sv})"不是“({sv})”。例如GVariant *args = g_variant_new_parsed("({'Transport': <%s>},)", "le");对于 SetDiscoveryFilter 和 GVariant *args = g_variant_new_parsed("({'offset': <%q>},)", offset);工作正常。

关于c++ - 带有 D-Bus BlueZ 的基本 BLE 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38334255/

相关文章:

linux - BlueZ 的蓝牙库 (Windows)

linux - 蓝牙 LE 信号强度 Linux

c++ - ESP : Auto login/accept message by OS with redirect to page like public WIFI portals access points

C++随机数总是相同的

c++ - 将函数名称作为参数传递给函数

c++ - 通过索引从 QJsonObject 获取值

android - 在 Android 低功耗蓝牙上读取 GATT 属性的问题

Android BLE 读取 Gatt 特性

iOS 蓝牙 : Unknown error when writing to characteristic

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