2013-06-09 2 views
2

Я пытаюсь реализовать агент сопряжения для BlueZ v5.5 с Qt и его функциональностью DBus.Объект QDBusAbstractAdaptor не экспортирует реализованный интерфейс dbus

У меня есть класс адаптера, созданный инструментом qdbusxml2cpp, который я назвал PairingAgentAdaptor, и класс с реализованными методами (PairingAgent), которые я предоставляю в качестве параметра при создании класса адаптера.

Я могу зарегистрировать объект в качестве нового агента, а демон BlueZ говорит, что мой агент зарегистрирован. Если я попытаюсь связать свой телефон с компьютером, демон BlueZ скажет: «Нет такого интерфейса» 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 
}; 
+0

Вы использовали qdbusviewer для проверки того, что адаптер отображается, как вы ожидали? Я не знаком с BlueZ, но разве демон определенно смотрит на системную шину, а не на сессионную шину? – Linville

+0

org.bluez появляется на системной шине и распознает мое приложение, когда я регистрирую его как новый агент. – pinki

ответ

3

У меня есть это сейчас. :)

Моя первая ошибка:

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. Правильный:

<!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>