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
};
qdbusviewer를 사용하여 어댑터가 예상대로 나타나는지 확인 했습니까? 저는 BlueZ에 익숙하지 않지만, 세션 버스가 아닌 시스템 버스를 확실히보고있는 데몬입니까? – Linville
org.bluez가 시스템 버스에 나타나고 새 에이전트로 등록 할 때 내 응용 프로그램을 인식합니다. – pinki