我开始在 Qt 中使用 DBus 和蓝牙。我想开发一个脚本,它只会通过 DBus 调用方法并得到回复。部分代码在这里(实际上是主要部分):
QString hostname("00:07:80:60:CE:22");
QDBusConnection bus = QDBusConnection::sessionBus();
QDBusInterface interface("org.bluez", "/", "Manager", bus, 0);
qDebug()<<"is valid: "<<interface.isValid()<<interface.lastError();
interface.lastError() 给出以下错误:
QDBusError("org.freedesktop.DBus.Error.ServiceUnknown", "名称 org.bluez 未由任何 .service 文件提供")
我安装了 bluez 和 dbus。我可以通过命令搜索蓝牙设备。
我也试过命令 sudo bluetoothd -d -n 我得到了这个: D-Bus 设置失败:名称已被使用 bluetoothd[21952]: 无法连接到 D-Bus
有谁知道可能是什么问题?
最佳答案
您遇到的错误(name already in use
)意味着蓝牙守护进程已经在您的系统上运行。您可以通过执行 sudo service bluetooth stop
来停止它,尽管我觉得这是结束蓝牙守护进程的一种相当残酷的方式。如果您结束守护进程,您也会结束 BlueZ D-Bus 实现,因此您将无法使用它。
虽然我从未使用过 Qt 的蓝牙/dbus 实现,但您的代码存在一些问题:
首先,BlueZ 接口(interface)是通过系统 总线发布的,而不是 session 总线,因此这是应该进行的第一个更改。
其次,你传递的"Manager"
参数的作用是什么?如果您尝试连接到名为 "Manager"
的 DBus 接口(interface),则没有。我不确定是否有,因为你在 2013 年问过这个问题。你可以看到 DBus 接口(interface) BlueZ 使用名为 D-Feet 的程序实现。您应该尝试一下,因为它帮助我理解了 BlueZ 与 DBus 的工作原理。我推荐 sudo apt-get install d-feet
。在 “/”
路径上发布的唯一接口(interface)是 org.freedesktop.DBus.Introspectable
和 org.freedesktop.DBus.Objectmanager
。同样,使用 D-Feet 可以很容易地看到和试验这一点,因为它允许抽象接口(interface)和路径的可视化表示。
如果您稍后遇到有关 GATT 的麻烦;使用 -E
实验标志运行 bluetoothd
;这将启用 BlueZ GATT 功能。 (请注意)。
关于c++ - Qt 中的 Dbus org.bluez 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18467179/