Я пытаюсь реализовать агент сопряжения для 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
};
Вы использовали qdbusviewer для проверки того, что адаптер отображается, как вы ожидали? Я не знаком с BlueZ, но разве демон определенно смотрит на системную шину, а не на сессионную шину? – Linville
org.bluez появляется на системной шине и распознает мое приложение, когда я регистрирую его как новый агент. – pinki