使用D-Bus BlueZ的基本BLE客户端

时间:2016-07-12 16:20:49

标签: 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 obj。 org.bluez总线的路径(使用d-feet检查)。这并不令人惊讶,因为它不是基于D-Bus的,但是当我使用StartDiscovery时,它根本不会检测到我的设备。也不是bluetoothctl。
  2. 之后我使用gatttool和simple-agent作为解决方法来创建对象路径然后使用我的程序连接但是我遇到了另一个问题:

    1. 当我尝试读取特征时,我得到“连接已关闭(18)”错误。我怀疑这与蓝牙设备之间的连接无关,它与D-Bus本身有关,因为当我尝试仅为LE设备设置扫描过滤器时,使用SetDiscoveryFilter,我收到同样的错误。
    2. 每当我只使用Connect和Disconnect功能时,一切似乎都运行良好,但对于这类应用程序的使用是有限的。 所以我的问题是:

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

      2. 如何正确阅读特征?

      3. 即使缩短后代码也很长,所以我把它放在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)

        进行编译

2 个答案:

答案 0 :(得分:2)

最后做对了 1.最近由BlueZ 5.41解决了。我的设备是“可扫描的”但不是“可发现的”。这意味着它广播了广告包,但因为它不允许没有PIN的连接来发现进一步的服务。在BlueZ 5.41中,如果使用SetDiscoveryFilter设置任何过滤器,这些设备在扫描过程中也会变得可见。这是https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/adapter-api.txt的最近(并且根本不直观!)的补充:

  

设置发现过滤器后,将将设备对象创建为新对象   无论它们是什么,都会发现具有匹配条件的设备   可连接或可发现的,可以听不可连接   和不可发现的设备。

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

答案 1 :(得分:1)

您根本不应使用Bluez C功能。而是使用较新的GDBus函数。在https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/adapter-api.txt,您可以了解如何扫描。致电StartDiscovery。然后将在发现DBus设备时添加它们。收听接口添加的信号以检测新设备。很奇怪,你说没有检测到任何设备,因为它应该可以工作。

ReadValue方法应该有效。您在阅读时是否已连接到设备?

还要使用hciconfig检查hci图层是否为UP。如果没有任何作用,你可以随时运行&#34; sudo btmon&#34;了解正在发生的事情。