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 了

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







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值