qt - QDBusAbstractAdaptor 对象不导出已实现的 dbus 接口(interface)

标签 qt interface dbus bluez qtdbus

我正在尝试使用 Qt 及其 DBus 功能实现 BlueZ v5.5 的配对代理。

我有一个由 qdbusxml2cpp 工具生成的适配器类,我将其称为 PairingAgentAdaptor,还有一个具有已实现方法 (PairingAgent) 的类,我在适配器类实例化时将其作为参数提供。

我可以将该对象注册为新代理,并且 BlueZ 守护程序表示我的代理已注册。如果我尝试将手机与计算机配对,BlueZ 守护程序会显示:“在对象路径 '/pairing/agent' 处没有此类接口(interface) 'org.bluez.Agent1'。”

我不知道我做错了什么。您能给我一些提示吗?

亲切的问候 迈克尔


代码:

main.cpp

// built using Qt 4.8.2

#include <QCoreApplication>
#include <bluedevil/bluedevil.h> // schaal's port to BlueZ 5

#define AGENT_PATH "/pairing/agent"

[...]

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    PairingAgent pairingAgent;
    PairingAgentAdaptor pairingAgentAdaptor(&pairingAgent);

    bool registerSuccess = QDBusConnection::systemBus().registerObject(QString(AGENT_PATH), &pairingAgentAdaptor);

    if (registerSuccess) {
        cout << "Registered as " << AGENT_PATH << endl;
    } else {
        QDBusConnection::systemBus().unregisterObject(QString(AGENT_PATH), QDBusConnection::UnregisterTree);

        registerSuccess = QDBusConnection::systemBus().registerObject(QString(AGENT_PATH), &pairingAgentAdaptor);

        if (registerSuccess) {
            cout << "Registered as " << AGENT_PATH << " (round 2)" << endl;
        } else {
            cerr << "Registering of " << AGENT_PATH << " failed." << endl;
            exit(1);
        }
    }

    Manager* const manager = Manager::self();
    manager->registerAgent(QString(AGENT_PATH), Manager::DisplayOnly);

    return app.exec();
}

pairingagentadaptor.h

[...]

/*
 * Adaptor class for interface org.bluez.Agent1
 */
class PairingAgentAdaptor: public QDBusAbstractAdaptor {
    Q_OBJECT
    Q_CLASSINFO("D-Bus Interface", "org.bluez.Agent1")
    Q_CLASSINFO("D-Bus Introspection", ""
"  <interface name=\"org.bluez.Agent1\">\n"
"    <method name=\"Release\"/>\n"
"    <method name=\"RequestPinCode\">\n"
"      <arg direction=\"in\" type=\"o\"/>\n"
"      <arg direction=\"out\" type=\"s\"/>\n"
"    </method>\n"
"    <method name=\"DisplayPinCode\">\n"
"      <arg direction=\"in\" type=\"o\"/>\n"
"      <arg direction=\"in\" type=\"s\"/>\n"
"    </method>\n"
"    <method name=\"RequestPasskey\">\n"
"      <arg direction=\"in\" type=\"o\"/>\n"
"      <arg direction=\"out\" type=\"u\"/>\n"
"    </method>\n"
"    <method name=\"DisplayPasskey\">\n"
"      <arg direction=\"in\" type=\"o\"/>\n"
"      <arg direction=\"in\" type=\"u\"/>\n"
"    </method>\n"
"    <method name=\"RequestConfirmation\">\n"
"      <arg direction=\"in\" type=\"o\"/>\n"
"      <arg direction=\"in\" type=\"u\"/>\n"
"    </method>\n"
"    <method name=\"RequestAuthorization\">\n"
"      <arg direction=\"in\" type=\"o\"/>\n"
"      <arg direction=\"in\" type=\"u\"/>\n"
"    </method>\n"
"    <method name=\"AuthorizeService\">\n"
"      <arg direction=\"in\" type=\"o\"/>\n"
"      <arg direction=\"in\" type=\"s\"/>\n"
"    </method>\n"
"    <method name=\"Cancel\"/>\n"
"  </interface>\n"
        "")
public:
    PairingAgentAdaptor(QObject *parent);
    virtual ~PairingAgentAdaptor();

public: // PROPERTIES
public Q_SLOTS: // METHODS
    void AuthorizeService(const QDBusObjectPath &in0, const QString &in1);
    void Cancel();
    void DisplayPasskey(const QDBusObjectPath &in0, uint in1);
    void DisplayPinCode(const QDBusObjectPath &in0, const QString &in1);
    void Release();
    void RequestAuthorization(const QDBusObjectPath &in0, uint in1);
    void RequestConfirmation(const QDBusObjectPath &in0, uint in1);
    uint RequestPasskey(const QDBusObjectPath &in0);
    QString RequestPinCode(const QDBusObjectPath &in0);
Q_SIGNALS: // SIGNALS
};

最佳答案

我现在已经拿到了。 :)

我的第一个错误:

PairingAgent pairingAgent;
PairingAgentAdaptor pairingAgentAdaptor(&pairingAgent);

bool registerSuccess = QDBusConnection::systemBus().registerObject(QString(AGENT_PATH), &pairingAgentAdaptor);

必须是

bool registerSuccess = QDBusConnection::systemBus().registerObject(QString(AGENT_PATH), &pairingAgent); // NEVER the adaptor!!!

我的第二个错误:我得到了错误的 org.bluez.Agent1 接口(interface)。正确的是:

<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
    <interface name="org.bluez.Agent1">
        <method name="Release" />
        <method name="RequestPinCode">
            <arg direction="in" type="o" />
            <arg direction="out" type="s" />
        </method>
        <method name="DisplayPinCode">
            <arg direction="in" type="o" />
            <arg direction="in" type="s" />
        </method>
        <method name="RequestPasskey">
            <arg direction="in" type="o" />
            <arg direction="out" type="u" />
        </method>
        <method name="DisplayPasskey">
            <arg direction="in" type="o" />
            <arg direction="in" type="u" />
            <arg direction="in" type="q" />
        </method>
        <method name="RequestConfirmation">
            <arg direction="in" type="o" />
            <arg direction="in" type="u" />
        </method>
        <method name="RequestAuthorization">
            <arg direction="in" type="o" />
        </method>
        <method name="AuthorizeService">
            <arg direction="in" type="o" />
            <arg direction="in" type="s" />
        </method>
        <method name="Cancel" />
    </interface>
</node>

关于qt - QDBusAbstractAdaptor 对象不导出已实现的 dbus 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17009732/

相关文章:

mysql - MySQL多线程死锁和批量插入表

java - 嵌套默认接口(interface)与嵌套 protected 接口(interface)有何不同?

interface - MagicDraw - 使用真正的 UML 符号显示界面

c# - 通过接口(interface)使用类的含义

c++ - Windbus 示例应用程序无法启动(无法解析服务器地址错误)

qt - 如何使用video 5.12 qt qml播放视频?

qt - 运算符删除如何在 qt5 中与 qObjects 一起工作

c++ - Floating/Embedded QDockWidget in a QWidget (KXmlGuiWindow's CentralWidget designed in QT Designer)

c - 用于控制firewalld的D-Bus API或C库

c++ - 使用 gdbus-codegen 生成的代码时如何堵塞内存泄漏?