基本的BLE客户端与D-Bus BlueZ

3
我正在使用(大家最喜欢的)编译为实验功能版本的BlueZ 5.40,并且需要通过D-Bus API扫描LE设备、配对并连接到其中一个设备,并读写一个特征。我已经研究了hcitool、gatttool和bluetoothctl的源代码,并使用GDBus创建了一个基本应用程序。但是,还存在一些问题。
1. 扫描不会将/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX对象路径添加到org.bluez总线中(使用d-feet进行检查)。考虑到它不是基于D-Bus的,这并不令人惊讶,但当我使用StartDiscovery时它根本不能检测到我的设备。bluetoothctl也是如此。
2. 然后,我使用gatttool和simple-agent作为解决方案来创建对象路径,然后使用我的程序进行连接,但我遇到了另一个问题:当我尝试读取一个特征时,我收到一个“连接已关闭(18)”的错误。我怀疑这与蓝牙设备之间的连接无关,而是与D-Bus本身有关,因为当我尝试仅为LE设备设置扫描过滤器时,使用SetDiscoveryFilter,我收到相同的错误。
每当我只使用连接和断开功能时,一切似乎都正常工作,但是这样的应用程序使用范围有限。所以我的问题是:
  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)

只需将代码放在这里。并非每个人都能访问外部网站,它们可能存在的时间也不会像StackOverflow那样长久。 - Daniel Margosian
2个回答

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

当设置发现过滤器时,无论可连接或可发现的设备是否符合匹配条件,都将创建Device对象,从而可以监听非可连接和非可发现的设备。

这只是我的错误。正如我所说,我在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);可以正常工作。

2
您不应该使用Bluez C函数,而应使用更新的GDBus函数。您可以在https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/adapter-api.txt找到如何进行扫描的方法。调用StartDiscovery。DBus设备将随着发现而被添加。监听interfaces-added信号以检测新设备。奇怪的是,您说没有检测到任何设备,因为它应该可以工作。
ReadValue方法应该可以工作。您在读取时是否已连接到设备?
还要使用hciconfig检查hci层是否启动。如果什么都不起作用,您总是可以运行“sudo btmon”来捕获正在发生的事情。

是的,我已连接并且我的hci适配器已启动。正如我所说,我认为“未连接”错误与BlueZ无关,而是DBus相关。当我尝试使用SetDiscoveryFilter设置扫描过滤器时,我会得到相同的错误。至于扫描,我将尝试通过btmon获得一些见解。感谢您对GDBusObjectManager的推动,但您确定我应该侦听interface-added而不是object-added吗?如果您愿意查看它,我将发布DBus扫描(约40 LOC)。 - mmatous
我对BlueZ并不是很熟悉。如果你在这里得不到更好的答案,可以尝试在http://www.bluez.org/development/lists/的邮件列表中提问。 - Emil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接