Доброго времени суток!
Пишу проект клиент-сервер. Предполагается, что сервер должен работать с правами суперпользователя и общаться с клиентом по средствам DBus. Поскольку документации мало, а ещё меньше внятной документации, начал с малого - создал архитектуру сервера и клиента и повесил на сервер 1 слот. Для sessionBus() это работало.
При попытке зарегистрировать сервис для systemBus, получил ошибку. Её решил поместив в "/etc/dbus-1/system.d/com.wifi.hostapd.ap.server.conf" следующее:
<!DOCTYPE busconfig PUBLIC
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<policy user="root">
<allow own="com.wifi.hostapd.ap.server"/>
</policy>
<policy context="default">
<allow send_interface="com.wifi.hostapd.ap.server"/>
<allow receive_sender="com.wifi.hostapd.ap.server"/>
<allow receive_interface="com.wifi.hostapd.ap.server"/>
</policy>
</busconfig>
Сервис создан, но клиент не может вызвать ни один метод. А вот qdbusviewer может.
Код сервера и создание сервиса:
#include <QtCore/QCoreApplication>
#include <QtDBus/QtDBus>
#include "apserver.h"
#include <QDebug>
#define _NameObject_ "com.wifi.hostapd.ap.server"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
APServer ServerAP;
QDBusConnection connection = QDBusConnection::systemBus();
if(!connection.isConnected())
{
qDebug() << "Unconnected. Exit.";
return -2;
}
bool ret = connection.registerService(_NameObject_);
if(ret)
qDebug() << "Registred 1";
else {
qDebug() << "Unregistred 1. Exit.";
return -1;
}
ret = connection.registerObject("/", &ServerAP, QDBusConnection::ExportAllSlots);
if(ret)
qDebug() << "Registred 2";
return a.exec();
}
apserver.h
#ifndef APSERVER_H
#define APSERVER_H
#include "traffic.h"
class APServer : public Traffic
{
Q_OBJECT
public:
APServer();
signals:
public slots:
Q_INVOKABLE void test(QString a);
};
#endif // APSERVER_H
Клиент:
#include <QtGui/QApplication>
#include "apclient.h"
#include <QDebug>
#include <QtDBus>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if(!QDBusConnection::systemBus().isConnected()) {
qDebug() << "Error connection to DBus";
return 1;
}
QDBusInterface iface("com.wifi.hostapd.ap.server", "/", "", QDBusConnection::systemBus());
iface.call("test", "test from client");
//APClient w;
//w.show();
return a.exec();
}
Что подскажите?
Заранее спасибо.