我计划开发一个应用程序,它将使用DBus和connman,这是一个嵌入式设备的无线管理器。根据我的理解,DBus公开了程序使用的方法,并允许开发人员在他们自己的程序中使用这些方法。
我知道Qt有QtDbus模块,如果我的理解是正确的,net.connman.Manager界面下的GetServices方法会显示可用的无线网络。从qdbusviewer程序检查GetServices方法的输出,我可以看到每个无线网络都有自己唯一的对象路径,例如 / net / connman / service / wifi_00120ec15ba0_4c616964614d616774616c6173_managed_psk 。
要使用net.connman.Services接口下的Connect和Disconnect方法,我需要对象路径,以便我可以创建一个允许我调用Connect / Disconnect的新接口。我目前正在尝试这里概述的方法How do I extract the returned data from QDBusMessage in a Qt DBus call?,但是当我尝试返回对象路径时,我只得到一个空白:
以下是获取对象路径的代码:
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和编程新手,所以任何帮助都会受到赞赏。
由于
答案 0 :(得分: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");
}