繁体   English   中英

具有D-Bus BlueZ的基本BLE客户端

[英]Basic BLE client with D-Bus BlueZ

我正在使用(每个人都喜欢的)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时,它根本无法检测到我的设备。 蓝牙也没有。

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

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

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

  1. 如何使用GDBus扫描LE设备? 如果无法实现,该如何手动添加设备或说服蓝牙为我完成此操作?

  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)编译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的最新内容(而且一点都不直观!):

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

  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); 工作正常。

您根本不应该使用Bluez C函数。 而是使用更新的GDBus函数。 https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/adapter-api.txt中,您可以找到扫描方法。 呼叫StartDiscovery。 发现时将添加DBus设备。 收听添加接口的信号以检测新设备。 奇怪的是您说没有设备被检测到,因为它可以工作。

ReadValue方法应该起作用。 您阅读时是否已连接到设备?

还要使用hciconfig检查hci层是否已启动。 如果没有任何效果,则可以始终运行“ sudo btmon”以捕获发生的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM