Извлекайте аргументы D-Bus и путь к объекту динамически из метода GetService net.connman.Manager

Я планирую разработать приложение, которое будет использовать DBus и connman, менеджер беспроводных сетей для встроенных устройств. Насколько я понимаю, DBus раскрывает методы, используемые программой, и позволяет разработчикам также использовать эти методы в своей собственной программе.

Я знаю, что в Qt есть модуль QtDbus, и, если я правильно понимаю, метод GetServices в интерфейсе net.connman.Manager показывает доступные беспроводные сети. Изучив выходные данные метода GetServices из программы qdbusviewer, я вижу, что каждая беспроводная сеть имеет свой собственный уникальный путь к объекту, например: / net / connman / service / wifi_00120ec15ba0_4c616964614d616774616c6173_managed_psk.

Чтобы использовать метод Connect и Disconnect в интерфейсе net.connman.Services, мне нужен путь к объекту, чтобы я мог создать новый интерфейс, который позволил бы мне вызывать Connect/Disconnect. В настоящее время я пробую методы, описанные здесь. Как мне извлечь возвращенные данные из QDBusMessage в вызове Qt DBus?, но я получаю пустое, только когда пытаюсь вернуть путь к объекту:

Вот мой код для получения пути к объекту:

QDBusConnection bus = QDBusConnection::systemBus();
QDBusInterface *interface = new QDBusInterface("net.connman",
                                               "/",
                                               "net.connman.Manager",
                                               bus,                                              
                                               this);

QDBusMessage test = interface->call("GetServices");
QList<QVariant> outArgs = test.arguments();

QVariant first = outArgs.at(0);
qDebug() << first;

QDBusVariant dbvFirst = first.value<QDBusVariant>();

QVariant vFirst = dbvFirst.variant();
qDebug() << vFirst;

QDBusArgument dbusArgs = vFirst.value<QDBusArgument>();
qDebug() << "QDBusArgument current type is" << dbusArgs.currentType();

QDBusObjectPath path;
dbusArgs.beginArray();
while (!dbusArgs.atEnd())
{
     dbusArgs >> path;
}

dbusArgs.endArray();
qDebug() << path.path();

Как извлечь аргументы и путь к объекту, возвращаемый методом GetService? Кто-нибудь сделал это правильно? Я новичок в Qt и программировании, поэтому любая помощь будет принята с благодарностью.

Спасибо

1 ответ

Это может быть поздно, но надеюсь, что это может помочь другим. Я не уверен в типе возврата вашего вызова (в dbus это a(oa{sv})), но я попытался использовать QArrayOfPathProperties. Итак, используя ваш код, возвращаемый тип из test.arguments() будет:

QArrayOfPathProperties outArg;

И извлечение может быть таким:

for (int row = 0; row < outArg.size(); ++row) {
     QMap<QString,QVariant> map = outArg.at(row).properties;
     // for example you can extract the value like this:
     auto serviceName = map.value("Name");     
}
Другие вопросы по тегам