Я делаю небольшое приложение, основанное на Qt, чтобы получить все носители Wifi возле моего встроенного Linux, и для этого я использую Connman с QtDBus. Чтобы получить все сигналы Wi-Fi, я пытаюсь получить автоматически сгенерированный код адаптера с помощью qdbusxml2cpp приложение. Для этого я использую файл connman-dbus.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="net.connman"/>
<allow send_destination="net.connman"/>
<allow send_interface="net.connman.Agent"/>
<allow send_interface="net.connman.Counter"/>
<allow send_interface="net.connman.Notification"/>
<allow send_interface="net.connman.Manager"/>
</policy>
<policy at_console="true">
<allow send_destination="net.connman"/>
</policy>
<policy context="default">
<deny send_destination="net.connman"/>
</policy>
</busconfig>
Затем я выполняю следующую команду:
$ qdbusxml2cpp -N -v /etc/dbus-1/system.d/connman-dbus.conf -a connmandbusexample.h:connmandbusexample.cpp
Но результатом этого является следующий код:
connmandbusexample.cpp
/*
* This file was generated by qdbusxml2cpp version 0.8
* Command line was: qdbusxml2cpp -N -v /etc/dbus-1/system.d/connman-dbus.conf -a connmandbusexample.h:connmandbusexample.cpp
*
* qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
*
* This is an auto-generated file.
* Do not edit! All changes made to it will be lost.
*/
#include "connmandbusexample.h"#include <QtCore/QMetaObject>
#include <QtCore/QByteArray>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
connmandbusexample.h
/*
* This file was generated by qdbusxml2cpp version 0.8
* Command line was: qdbusxml2cpp -N -v /etc/dbus-1/system.d/connman-dbus.conf -a connmandbusexample.h:connmandbusexample.cpp
*
* qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
*
* This is an auto-generated file.
* This file may have been hand-edited. Look for HAND-EDIT comments
* before re-generating it.
*/
#ifndef CONNMANDBUSEXAMPLE_H_1462807819
#define CONNMANDBUSEXAMPLE_H_1462807819
#include <QtCore/QObject>
#include <QtDBus/QtDBus>
QT_BEGIN_NAMESPACE
class QByteArray;
template<class T> class QList;
template<class Key, class Value> class QMap;
class QString;
class QStringList;
class QVariant;
QT_END_NAMESPACE
#endif
Как видите, этот код бесполезен, поэтому мне интересно, что я делаю не так с qdbusxml2cpp. Кроме того, я не знаю, смогу ли я сделать это с другим, более правильным подходом, чем использование QtDBus. Наконец, возможно ли подключиться к сети Wi-Fi из приложения Qt, которое не работает с разрешениями root? Я думаю, что все вышеперечисленное — очень связанные вопросы, которые могут помочь в этой теме.
Конвертируемый файл является файлом конфигурации для демона DBus, но не спецификацией интерфейса для интерфейса DBus. Он только описывает, какие сигналы разрешено отправлять по шине от / к conman, но не как они выглядят.
Нужно конвертировать правильный интерфейс xml, он должен выглядеть примерно так этот. Рекомендуется использовать спецификацию интерфейса для конкретной версии conman, которую вы используете, я просто взял в качестве примера последнюю версию транка из github.
Вы можете найти больше информации об описании интерфейса DBus в формате xml (формат самоанализа) Вот.
Я не знаком с функциональностью conman или с тем, какая часть его функций доступна через D-Bus, но после быстрого взгляда на эти заметки похоже, что вы должны иметь возможность сканировать доступные интерфейсы через этот интерфейс — попробуйте использовать метод net.connman.Technology.Scan.
Обычно в использовании QDbus нет ничего плохого, в документации даже говорится:
Следует отметить, что низкоуровневая реализация в первую очередь не предназначена для использования авторами приложений. Скорее, это основа для обязательных авторов и ссылка для повторной реализации. Если вы можете сделать это, рекомендуется использовать одну из привязок или реализаций более высокого уровня.
QtDBus является одним из эти привязки более высокого уровня.
Других решений пока нет …