我正在构建一个简单的基于Qt的应用程序,用于监视和连接到WiFi网络。我通过它的D总线API与Connman接口,并且能够扫描可用的网络,打开/关闭技术,并按预期注册代理。当前,当调用Connman RequestInput方法(试图连接到受保护/安全的网络时)时,我无法提供请求的密码,因为我不确定如何将RequestInput方法与Qt中的函数绑定。
下面是一些指示性代码,其中概述了这一方法:
//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环境变量启用调试,则会收到以下信息:
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}签名。
我的问题:
中返回所需的QVariantMap
发布于 2022-03-14 16:43:24
从调试输出中可以看出,ConnMan正在执行MethodCall,但是QDBusConnection::connect()用于处理DBus单曲,这就是为什么没有调用插槽的原因。
您需要将实现net.connman.Agent接口的对象注册到相应的路径上,以便ConnMan可以调用您的方法:
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
};然后在相应的路径上注册:
connection.registerObject(
QStringLiteral("/test/agent"),
new ConnManAgent(this),
QDBusConnection::ExportAllInvokables);这将所有标记为Q_INVOKABLE的方法导出到DBus。您也可以将它们标记为Q_SLOTS并使用ExportAllSlots,这主要取决于您。
https://stackoverflow.com/questions/71462627
复制相似问题