libnm-qt 填坑
最近做 嵌入式下 qt dbus 通信 时 使用 networkmanager 获取 网络状态核设置ip
networkmanager 有简单的示例但是 操作 纯dbus 通信 过于 复杂
然后
发现 kde 有个 libnm-qt 用qt 写的 好办 就移植编译了一下
这个才是坑的开始 示例 只有 显示 ip 和连接wifi 的一个测试
那我像自己静态ip 怎么办呢 扯淡了 没有任何文档 只能自己分析
https://conf.qtcon.org/system/attachments/123/original/akademy-2016.pdf?1473087776
看到这个 也是 设置 wifi 的
然后 自己改造吧
NetworkManager::ConnectionSettings *settings = new NetworkManager::ConnectionSettings(NetworkManager::ConnectionSettings::Wired);
settings->setId("__Test connection__");
settings->setUuid(QUuid::createUuid().toString().mid(1, QUuid::createUuid().toString().length() - 2));
NetworkManager::Ipv4Setting::Ptr ipv4Setting =
settings->setting(NetworkManager::Setting::Ipv4).dynamicCast<NetworkManager::Ipv4Setting>();
// ipv4Setting->setType(NetworkManager::Setting::Ipv4);
ipv4Setting->setMethod(NetworkManager::Ipv4Setting::Manual);
NetworkManager::addConnection(
settings->toMap()
);
提交 报错 到底什么问题呢 然后 dbug 一下 setting tomap 的内容 发现缺少 ipv4 难道这样不行
代码 追啊追 追啊追。。。。 耗时了大半天
connectionsettings.cpp
foreach (const Setting::Ptr &setting, settings()) {
QVariantMap map = setting->toMap();
if (!setting->isNull()) {
result.insert(setting->name(), map);
}
}
分析到 莫非 isnull 判断有误 明明 有数据
最近去查看
bool NetworkManager::Setting::isNull() const
{
Q_D(const Setting);
return !d->initialized;
}
what ? 是库封装了个函数 竟然是返回 是判断 这个的标记
initialized
好吧 看哪个地方设置
看到头文件 有个
void setInitialized(bool initialized);
好吧 服了 改进一下代码
NetworkManager::Ipv4Setting::Ptr ipv4Setting = // new NetworkManager::Ipv4Setting;
// dynamic_cast<NetworkManager::Ipv4Setting>(settings->setting(NetworkManager::Setting::Ipv4));
settings->setting(NetworkManager::Setting::Ipv4).dynamicCast<NetworkManager::Ipv4Setting>();
// ipv4Setting->setType(NetworkManager::Setting::Ipv4);
ipv4Setting->setMethod(NetworkManager::Ipv4Setting::Manual);
ipv4Setting->setInitialized(true);
打印一下 setting map 好了 加进去了 抽根烟 准备 提交
抽
烟
中
...........
失败了
什么问题哦
QDBusMarshaller: type `NMVariantMapMap' (276) is not registered with D-BUS. Use qDBusRegisterMetaType to register it
QDBusConnection: error: could not send message to service "org.freedesktop.NetworkManager" path "/org/freedesktop/NetworkManager/Settings" interface "org.freedesktop.NetworkManager.Settings" member "AddConnection": Marshalling failed: Unregistered type NMVariantMapMap
passed in arguments
NetworkManagerQt "newnetworkmanger" ( 10469 ) void NetworkManager::SettingsPrivate::init() : New Connections list
继续看下 map
QMap(("connection", QMap(("id", QVariant(QString, "__Test connection__") ) ( "type" , QVariant(QString, "802-3-ethernet") ) ( "uuid" , QVariant(QString, "e016e13f-699b-495e-9cc0-289b713f809f") ) ) ) ( "ipv4" , QMap(("method", QVariant(QString, "manual") ) ) ) )
我曹 没问题啊
到底需要什么样的格式啊 郁闷
莫非
NetworkManager::addConnection(map);
这里 。。。
看到了这个
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(connection);
return asyncCallWithArgumentList(QLatin1String("AddConnection"), argumentList);
那我换种方式吧
QDBusInterface interface(
NM_DBUS_SERVICE,
NM_DBUS_PATH_SETTINGS,
NM_DBUS_IFACE_SETTINGS,
QDBusConnection::systemBus());
qDBusRegisterMetaType<NMVariantMapMap>();
QDBusReply<QDBusObjectPath> result = interface.call("AddConnection", QVariant::fromValue(map));
if (!result.isValid()) {
qDebug() << QString("Error adding connection: %1 %2").arg(result.error().name()).arg(result.error().message());
} else {
qDebug() << QString("Added: %1").arg(result.value().path());
}
ok 了 竟然ok 了
好吧 暂且先这样吧 自带的提交 不知道问题出在了哪 对那种提交方式不了解