gpt4 book ai didi

c++ - Qt DBUS NetworkManager 从 IP4Config 接口(interface)获取地址

转载 作者:行者123 更新时间:2023-12-05 04:31:00 26 4
gpt4 key购买 nike

我使用 QtDBusNetworkManager 有一段时间了,但遇到了问题。我需要访问 Wi-Fi 设备 IP 地址,获取它的方法是获取 Wi-Fi 设备对象,获取其 IP4Config 属性(一个 QDbusObjectPath 对象),然后获取 地址数据。问题是,一旦我尝试使用接口(interface) property 方法获取 AddressData,我的应用程序就会崩溃。

我相信我需要注册一个元类型(我已经为其他类型注册了)但似乎无法弄清楚如何解压从属性返回的 aa{sv} 数据。使用 qdbusviewer 我可以看到 IP 地址的数据。

我如何从酒店获取此信息?

这是遇到问题的代码片段。似乎我可以获得 Gateway 的 QString 属性,但是当我尝试获取 AddressData 时,我的进程崩溃了(如下所示)。

    cout << wifi_args.size() << endl;
cout << wifi_args[0].path().toStdString() << endl;
if (wifi_args.size() > 0) {

QDBusInterface wifi_device(NM_DBUS_SERVICE, wifi_args[0].path(),
NM_DBUS_INTERFACE_DEVICE,
QDBusConnection::systemBus());

const auto wifiInterface = wifi_device.property("Interface").toString();
// auto wifiIPv4 = wifi_device.property("Ip4Address").toInt();
auto ip4_config_path =
qdbus_cast<QDBusObjectPath>(wifi_device.property("Ip4Config"));

cout << "config path = " << ip4_config_path.path().toStdString()
<< endl;

QDBusInterface wifi_ip4_if(NM_DBUS_SERVICE, ip4_config_path.path(),
NM_DBUS_INTERFACE_IP4_CONFIG,
QDBusConnection::systemBus());

auto gateway = wifi_ip4_if.property("Gateway").toString();
auto ipv4 = wifi_ip4_if.property("AddressData");

// for (auto item : wifiIPv4) {
// cout << "Item";
// }

cout << "Interface = " << wifiInterface.toStdString() << endl;
cout << "Gateway = " << gateway.toStdString() << endl;
// cout << "Address = " << int_to_ipv4(wifiIPv4) << endl;
} else {
cerr << "ERROR: Multiple wifi devices found!" << endl;
}

这是运行的输出:

michael_uman@ThinkPad-X1-Carbon-7th ~/gitroot/UXHUB-development (development)$ ./build-host/app/kylixctl/kylixctl list wifi
1
/org/freedesktop/NetworkManager/Devices/3
config path = /org/freedesktop/NetworkManager/IP4Config/8
Cannot construct placeholder type QDBusRawType
Aborted (core dumped)

最佳答案

您可以使用 org.freedesktop.DBus.Properties.Get 安全地获取相关属性,然后手动解码响应,类似于 Fatal error when trying to get a DBus property with custom type

// Required operator for demarshalling aa{sv} signature
const QDBusArgument &operator>>(const QDBusArgument &argument, QList<QVariantMap> &varMapList)
{
argument.beginArray();
varMapList.clear();

while(!argument.atEnd()) {
QVariantMap map;
argument >> map;
varMapList.append(map);
}

argument.endArray();
return argument;
}
// Use generic property interface.
QDBusInterface getter(NM_DBUS_SERVICE, wifi_args[0].path(), "org.freedesktop.DBus.Properties", QDBusConnection::systemBus());
// Use the Get function to manually access the AddressData property.
auto reply = getter.call("Get", NM_DBUS_INTERFACE_IP4_CONFIG, "AddressData");
// Extract the needed argument from the reply.
auto arg = reply.arguments().first();
// Demarshall the argument into Qt's aa{sv} equivalent.
QList<QVariantMap> list;
arg.value<QDBusVariant>().variant().value<QDBusArgument>() >> list;
// Access the address data.
cout << "Address = " << list.first()["address"].toString().toStdString();

这应该足以在不使 Qt 崩溃的情况下获取所需的数据。

关于c++ - Qt DBUS NetworkManager 从 IP4Config 接口(interface)获取地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71932442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com