首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用RequestInput捕获和响应Connman‘QtDBus’方法调用

用RequestInput捕获和响应Connman‘QtDBus’方法调用
EN

Stack Overflow用户
提问于 2022-03-14 03:14:21
回答 1查看 179关注 0票数 0

我正在构建一个简单的基于Qt的应用程序,用于监视和连接到WiFi网络。我通过它的D总线API与Connman接口,并且能够扫描可用的网络,打开/关闭技术,并按预期注册代理。当前,当调用Connman RequestInput方法(试图连接到受保护/安全的网络时)时,我无法提供请求的密码,因为我不确定如何将RequestInput方法与Qt中的函数绑定。

下面是一些指示性代码,其中概述了这一方法:

代码语言:javascript
复制
//Create a QDBusConnection systemBus() object
QDBusConnection connection = QDBusConnection::systemBus();

//Ensure the systemBus() connection is established
if (!connection.isConnected()) {
    qDebug() << "Connection error.";
}

//Create a Connman Manager D-Bus API interface object
QDBusInterface manager("net.connman", "/", "net.connman.Manager", connection);

//Register an agent with the Connman Manager API
manager.call("RegisterAgent", QVariant::fromValue(QDBusObjectPath("/test/agent")));

//Attempt to bind the mySlot() function with the net.connman.Agent RequestInput method
//This does not currently work
connection.connect("",
                   "/test/agent",
                   "net.connman.Agent",
                   "RequestInput",
                    this,
                    SLOT(mySlot(QDBusObjectPath, QVariantMap)));

//Create a Connman Service D-Bus API interface object (for a specific WiFi Service)
QDBusInterface service("net.connman",
                       "/net/connman/service/[WIFI SERVICE]",
                       "net.connman.Service",
                        connection);

//Attempt to connect to the secure WiFi network
//Note: this network has not previously been connected, so the RequestInput method is guaranteed to be called
service.call("Connect");

QVariantMap myClass::mySlot(const QDBusObjectPath &path, const QVariantMap &map)
{
    //Connman Agent RequestInput() method received
}

如上所述,尝试将/test/agent路径、net.connman.Agent接口和RequestInput方法绑定到mySlot()函数的尝试不起作用;没有报告错误,但从未调用mySlot()函数。如果使用QDBUS_DEBUG环境变量启用调试,则会收到以下信息:

代码语言:javascript
复制
QDBusConnectionPrivate(0xffff74003a00) got message (signal): QDBusMessage(type=MethodCall, service=":1.3", path="/test/agent", interface="net.connman.Agent", member="RequestInput", signature="oa{sv}", contents=([ObjectPath: /net/connman/service/[WIFI SERVICE]], [Argument: a{sv} {"Passphrase" = [Variant: [Argument: a{sv} {"Type" = [Variant(QString): "psk"], "Requirement" = [Variant(QString): "mandatory"]}]]}]) )

上面的内容正是我所期望的;RequestInput方法是为net.connman.Agent接口上的/test/agent路径调用的,该路径具有oa{sv}签名。

我的问题:

  1. 如何“连接”到RequestInput方法调用,以便
  2. 的mySlot()函数能够解析RequestInput方法数据?
  3. 如何从mySlot()?

中返回所需的QVariantMap

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-14 16:43:24

从调试输出中可以看出,ConnMan正在执行MethodCall,但是QDBusConnection::connect()用于处理DBus单曲,这就是为什么没有调用插槽的原因。

您需要将实现net.connman.Agent接口的对象注册到相应的路径上,以便ConnMan可以调用您的方法:

代码语言:javascript
复制
class ConnManAgent : public QObject {
    Q_OBJECT
    Q_CLASSINFO("D-Bus Interface", "net.connman.Agent")
public:
    ConnManAgent(QObject *parent = nullptr);

    Q_INVOKABLE QVariantMap RequestInput(const QDBusObjectPath &, const QVariantMap &);

   // ... Rest of the net.connman.Agent interface
};

然后在相应的路径上注册:

代码语言:javascript
复制
connection.registerObject(
    QStringLiteral("/test/agent"),
    new ConnManAgent(this), 
    QDBusConnection::ExportAllInvokables);

这将所有标记为Q_INVOKABLE的方法导出到DBus。您也可以将它们标记为Q_SLOTS并使用ExportAllSlots,这主要取决于您。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71462627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档