c++ - Qt 中的 Dbus org.bluez 实现

标签 c++ qt bluetooth dbus bluez

我开始在 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.Introspectableorg.freedesktop.DBus.Objectmanager。同样,使用 D-Feet 可以很容易地看到和试验这一点,因为它允许抽象接口(interface)和路径的可视化表示。

如果您稍后遇到有关 GATT 的麻烦;使用 -E 实验标志运行 bluetoothd;这将启用 BlueZ GATT 功能。 (请注意)。

关于c++ - Qt 中的 Dbus org.bluez 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18467179/

相关文章:

c++ - 如何在 varC++ 中将 int 与字符串组合

c++ - 需要手动删除 QValidator 吗?

c++ - STL 复制、对、 vector 和插入器

javascript - 如何在 QWebView 中通过 C++ 触发 JavaScript 事件

c++ - 移动 QMainWindow 不会影响子窗口部件的绘制位置

android - startBluetoothSco() 在 ICS 上抛出安全异常 (BROADCAST_STICKY)

c# - 低功耗蓝牙扫描仪 Xamarin Android

bluetooth - 如何使用 rfcomm 将多个 Android 智能手机连接到我的 Raspberry Pi 3?

c++ - Qt应用取消退出事件

c++ - iOS:找不到架构 i386 的 sin() 符号