C++ 如何使用Qt在D-Bus上创建/实例化配对代理

C++ 如何使用Qt在D-Bus上创建/实例化配对代理,c++,linux,qt,dbus,C++,Linux,Qt,Dbus,我正在尝试构建一个Qt应用程序,用于在Linux设备上配对/连接蓝牙设备。正如BlueZ官方网站()中描述的那样,我在D-Bus上使用BlueZ API() 一般程序如下所述: 目前,我可以使用API来配对/连接设备而不会出现问题 但我不知道如何使用配对代理 我试图遵循这里指出的方向: 我在网上搜索了很多,有很多代码: 但是,我还是不明白这是怎么回事。Python中还有很多脚本,但是我正在使用C++。< /P> 我的(伪)代码如下所示: agentManager = new QD

我正在尝试构建一个Qt应用程序,用于在Linux设备上配对/连接蓝牙设备。正如BlueZ官方网站()中描述的那样,我在D-Bus上使用BlueZ API()

一般程序如下所述:

目前,我可以使用API来配对/连接设备而不会出现问题

但我不知道如何使用配对代理

我试图遵循这里指出的方向:

我在网上搜索了很多,有很多代码:

但是,我还是不明白这是怎么回事。Python中还有很多脚本,但是我正在使用C++。< /P> 我的(伪)代码如下所示:

agentManager = new QDBusInterface("org.bluez","/org/bluez","org.bluez.AgentManager1",QDBusConnection::systemBus(),this);
agent = new QDBusInterface("org.bluez","/org/bluez/agent","org.bluez.Agent1",QDBusConnection::systemBus(),this);


QDBusReply<void> reply;

reply = agentManager->call("RegisterAgent", QVariant::fromValue(QDBusObjectPath(path)), capability);
if (!reply.isValid()) {
    qDebug() << reply.error().message() << reply.error().name();
}

reply = agentManager->call("RequestDefaultAgent", QVariant::fromValue(QDBusObjectPath(path)));
if (!reply.isValid()) {
    qDebug() << reply.error().message() << reply.error().name();
}

QDBusReply<QString> reply_str = agent->call("RequestPinCode", QVariant::fromValue(QDBusObjectPath(path)));
if (reply_str.isValid()) {
    pincode = reply_str.value();
} else {
    qDebug() << reply_str.error().message() << reply.error().name();
}

agentManager=newqdbusinterface(“org.bluez”、“/org/bluez”、“org.bluez.AgentManager1”、QDBusConnection::systemBus(),this);
代理=新的QDBusInterface(“org.bluez”,“org/bluez/agent”,“org.bluez.Agent1”,QDBusConnection::systemBus(),this);
答复;;
reply=agentManager->call(“RegisterAgent”,QVariant::fromValue(QDBusObjectPath(path)),capability);
如果(!reply.isValid()){

qDebug()好的,现在它可以工作了。中介绍了该方法

实现的详细信息见本问题的最后一个编辑。最后一件事是使用callWithCallback在Device1接口上异步实现“Pair”方法:

void cBluetoothDevice::Pair() {

    QList<QVariant> args;
    args.clear();

    device->callWithCallback("Pair",args, this, SLOT(PairSlot(QDBusMessage)));
}

void cBluetoothDevice::Pair(){
QList-args;
args.clear();
设备->callWithCallback(“Pair”,args,this,SLOT(PairSlot(QDBusMessage));
}

如果设备是QDBusInterface*

我正在使用qdbusviewer探索对象,我找不到代理。如果您想实现用户输入pincode或接受连接的UI,您必须实际编写一个D-Bus服务来实现整个org.bluez.Agent1接口。@JussiKukkonen因此,我无法添加interface到已经存在的org.bluez服务?我必须实例化一个全新的服务?现在我正试图弄清楚qt是如何完成这项工作的()。我不能使用qt蓝牙模块,因为我必须使用qt 4.8I,我设法使它工作。:)我刚刚用callWithCallback调用了“Pair”异步

class MyObject : public QObject
{
    Q_OBJECT

public:
    MyObject();

public Q_SLOTS:
    QString RequestPinCode(const QDBusObjectPath &in0);
};


MyObject::MyObject() {

}
QString MyObject::RequestPinCode(const QDBusObjectPath& in0)
{
    qDebug() << "MyObject" << in0.path();


    QString str = "2974";
    return str;
}



class MyQDusAdaptor: 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=\"RequestPinCode\">\n"
                                                                         "      <arg direction=\"in\" type=\"o\"/>\n"
                                                                         "      <arg direction=\"out\" type=\"s\"/>\n"
                                                                         "    </method>\n"
                                                                         "  </interface>\n"
                                                                         "")

public:
        MyQDusAdaptor(QObject *parent);
        virtual ~MyQDusAdaptor();

public: // PROPERTIES
public Q_SLOTS: // METHODS
        QString RequestPinCode(const QDBusObjectPath &in0);
};


MyQDusAdaptor::MyQDusAdaptor(QObject* parent) : QDBusAbstractAdaptor(parent) {

    setAutoRelaySignals(true);
}

MyQDusAdaptor::~MyQDusAdaptor() {

}

QString MyQDusAdaptor::RequestPinCode(const QDBusObjectPath& in0)
{
    qDebug() << "MyQDusAdaptor" << in0.path();

    QString out0;
         QMetaObject::invokeMethod(parent(), "RequestPinCode", Q_RETURN_ARG(QString, out0), Q_ARG(QDBusObjectPath, in0));
         return out0;
}

void cBluetoothDevice::Pair() {

    QList<QVariant> args;
    args.clear();

    device->callWithCallback("Pair",args, this, SLOT(PairSlot(QDBusMessage)));
}