从 net.connman.Manager 的 GetService 方法中动态提取 D-Bus 参数和对象路径

Posted

技术标签:

【中文标题】从 net.connman.Manager 的 GetService 方法中动态提取 D-Bus 参数和对象路径【英文标题】:Extract D-Bus arguments and object path dynamically from net.connman.Manager's GetService method 【发布时间】:2015-05-12 19:30:47 【问题描述】:

我正计划开发一个使用 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 和编程的新手,因此我们将不胜感激。

谢谢

【问题讨论】:

【参考方案1】:

这可能会迟到,但希望这可以帮助其他人。我不确定您调用的返回类型(在 dbus 中它的 a(oasv)),但我尝试使用 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");     

【讨论】:

什么是QArrayOfPathProperties? @benziv @bartlomiej.n,tbh,在我发布答案时,我认为它是 Qt 类/类型.. 结果不是。很可能它是我以前项目中使用的一个类的 typedef .. 比如:searchcode.com/codesearch/view/27333999

以上是关于从 net.connman.Manager 的 GetService 方法中动态提取 D-Bus 参数和对象路径的主要内容,如果未能解决你的问题,请参考以下文章

从 Code::Blocks 配置 g++ 不会影响命令行

试图从 g++ 中理解简单的反汇编代码

Lua:如何从_G中提取函数?

在 Grails 中,如何从 g:select 调用控制器操作

如何从我的 Mac 上的终端窗口运行 g++

G是蛋白质,为啥可以从DNA画箭头指向G