我正在使用(大家最喜欢的)编译为实验功能版本的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. 扫描不会将/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,我收到相同的错误。
每当我只使用连接和断开功能时,一切似乎都正常工作,但是这样的应用程序使用范围有限。所以我的问题是:
- 如何使用GDBus扫描LE设备?如果不可能,如何手动添加设备或说服bluetoothd为我完成此操作?
- 如何正确读取特征值?
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)
。