2013-06-09 8 views
2

Qt 및 해당 DBus 기능을 사용하여 BlueZ v5.5 용 페어링 에이전트를 구현하려고합니다.QDBusAbstractAdaptor 객체가 구현 된 dbus 인터페이스를 내 보내지 않습니다.

나는 어댑터 클래스를 인스턴스화 할 때 매개 변수로 제공하는 구현 된 메소드 (PairingAgent)가있는 PairingAgentAdaptor 및 클래스를 호출하는 qdbusxml2cpp 도구로 생성되는 어댑터 클래스가 있습니다.

개체를 새 에이전트로 등록 할 수 있으며 BlueZ 데몬에서 내 에이전트가 등록되었다고 말합니다. 내 전화기를 컴퓨터와 연결하려고하면 BlueZ 데몬은 "객체 경로 '/ pairing/agent'에 '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>