问题描述
我正在调用 ListConnections 方法来列出系统上已配置的所有连接。 我试图使用网络管理器的 getSettings 方法来检索每个连接的 id,然后使用 Delete 方法删除特定连接 问题是,我不能只得到 id。我举了一个例子:https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/C/qt/change-ipv4-addresses.cpp
我的代码:
#include <QtDBus/QtDBus>
typedef QMap<QString,QMap<QString,QVariant> > Connection;
Q_DECLARE_MetaTYPE(Connection)
Q_DECLARE_MetaTYPE(QList<uint>);
Q_DECLARE_MetaTYPE(QList<QList<uint> >);
const QString NM_SETTING_CONNECTION_SETTING_NAME = "connection";
const QString NM_SETTING_CONNECTION_ID = "id";
const QString NM_SETTING_CONNECTION_UUID = "uuid";
QDBusConnection bus = QDBusConnection::systemBus();
QDBusInterface NetworkManager("org.freedesktop.NetworkManager",// service
"/org/freedesktop/NetworkManager/Settings",// path
"org.freedesktop.NetworkManager.Settings",// interface
bus);
if(!NetworkManager.isValid())
{
qDebug()<< "Failed to connect to the system bus" << NetworkManager.lastError() <<endl ;
return ;
}
QDBusReply<QList<QDBusObjectPath> > Connections = NetworkManager.call("ListConnections");
qDebug() << "reading saved networks..." << endl;
foreach (const QDBusObjectPath& connection,Connections.value())
{
qDebug() << "existing connections: " << connection.path() << endl;
QDBusInterface NetworkManagerSettings("org.freedesktop.NetworkManager",connection.path(),"org.freedesktop.NetworkManager.Settings.Connection",QDBusConnection::systemBus());
QDBusMessage Settings = NetworkManagerSettings.call("GetSettings");
QVariant t = Settings.arguments().at(0);
qDebug()<< Settings << endl;
qDebug()<< "T :" << t.value<QDBusArgument>().currentType() << endl ; //is Qmap
qDebug()<< "VALUE :" << t.value<QMap <QString,QVariant>>() << endl ;
Connection settings;
QDBusReply<Connection > result2 = NetworkManagerSettings.call("GetSettings");
qDebug()<< "SETTINGS : " << result2.value().isEmpty() << endl;
}
终端返回:
2021-04-17 15:54:14 : existing connections: "/org/freedesktop/NetworkManager/Settings/9"
2021-04-17 15:54:14 : QDBusMessage(type=MethodReturn,service=":1.13",signature="a{sa{sv}}",contents=([Argument: a{sa{sv}} {"ipv6" = [Argument: a{sv} {"address-data" = [Variant: [Argument: aa{sv} {}]],"addresses" = [Variant: [Argument: a(ayuay) {}]],"dns" = [Variant: [Argument: aay {}]],"dns-search" = [Variant(QStringList): {}],"method" = [Variant(QString): "auto"],"route-data" = [Variant: [Argument: aa{sv} {}]],"routes" = [Variant: [Argument: a(ayuayu) {}]]}],"connection" = [Argument: a{sv} {"id" = [Variant(QString): "Auto SFR_7080"],"interface-name" = [Variant(QString): "wlp8s0"],"permissions" = [Variant(QStringList): {}],"timestamp" = [Variant(qulonglong): 1618667506],"type" = [Variant(QString): "802-11-wireless"],"uuid" = [Variant(QString): "a6a7d882-5483-49d9-84c0-d3de815d5bc7"]}],"proxy" = [Argument: a{sv} {}],"ipv4" = [Argument: a{sv} {"address-data" = [Variant: [Argument: aa{sv} {}]],"addresses" = [Variant: [Argument: aau {}]],"dns" = [Variant: [Argument: au {}]],"routes" = [Variant: [Argument: aau {}]]}],"802-11-wireless-security" = [Argument: a{sv} {"auth-alg" = [Variant(QString): "open"],"key-mgmt" = [Variant(QString): "wpa-psk"]}],"802-11-wireless" = [Argument: a{sv} {"mac-address-blacklist" = [Variant(QStringList): {}],"mode" = [Variant(QString): "infrastructure"],"security" = [Variant(QString): "802-11-wireless-security"],"seen-bssids" = [Variant(QStringList): {"24:95:04:E0:70:84"}],"ssid" = [Variant(QByteArray): {83,70,82,95,55,48,56,48}]}]}]) )
2021-04-17 15:54:14 : T : 4
2021-04-17 15:54:14 : VALUE : QMap()
2021-04-17 15:54:14 : SETTINGS : true
我不明白为什么我的 QMap 是空的?为什么它根本不包含任何东西? 如何获取ssid对应的id
解决方法
尝试使用
typedef QMap<QString,QVariantMap> Connection;
代替
typedef QMap<QString,QMap<QString,QVariant> > Connection;
因此函数调用将如下所示:
QDBusInterface setting(NETWORK_MANAGER_SERVICE,settingsPath,NETWORK_MANAGER_SETT_CONN_INTERFACE,QDBusConnection::systemBus());
qDebug() << "settingsPath: " << settingsPath;
QDBusMessage result = setting.call("GetSettings");
const QDBusArgument &dbusArg = result.arguments().at(0).value<QDBusArgument>();
Connection connection;
dbusArg >> connection;
qDebug() << "id: " << connection["connection"]["id"].toString();
输出如下所示:
settingsPath: "/org/freedesktop/NetworkManager/Settings/3"
id: "enp0s3_dhcp_config"