libnm-qt 填坑

来源:互联网 发布:javascript input赋值 编辑:程序博客网 时间:2024/06/05 00:54

最近做 嵌入式下 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 了

好吧  暂且先这样吧  自带的提交 不知道问题出在了哪  对那种提交方式不了解







原创粉丝点击