NetworkManager 和 Qt 问题
Posted
技术标签:
【中文标题】NetworkManager 和 Qt 问题【英文标题】:NetworkManager and Qt Problem 【发布时间】:2011-05-28 15:43:40 【问题描述】:我仍然是使用 Qt4/Dbus 的新手,我正在尝试使用 Qt API 获取访问点列表以发送/接收 Dbus 消息。 我收到以下错误:
org.freedesktop.DBus.Error.UnknownMethod
Method "GetAccessPoint" with signature "" on interface "org.freedesktop.NetworkManager.Device.Wireless" doesn't exist
代码是:
QStringList *netList = new QStringList();
QDBusConnection sysbus = QDBusConnection::systemBus();
QDBusInterface callNM("org.freedesktop.NetworkManager","/org/freedesktop/NetworkManager","org.freedesktop.NetworkManager.Device.Wireless",sysbus);
if(callNM.isValid())
QDBusMessage query= callNM.call("GetAccessPoints");
if(query.type() == QDBusMessage::ReplyMessage)
QDBusArgument arg = query.arguments().at(0).value<QDBusArgument>();
arg.beginArray();
while(!arg.atEnd())
QString element = qdbus_cast<QString>(arg);
netList->append(element);
arg.endArray();
else
std::cout<< query.errorName().toStdString() << std::endl;
std::cout<< query.errorMessage().toStdString() << std::endl;
int x= netList->size();
for(int y=0; y< x ;y++)
widget.avail_nets->addItem(netList->at(y)); // just print it to my gui from the stringlist array
else
std::cout<<"fail" << std::endl;
怎么了?我的命名是正确的,我遵循here的确切规格
【问题讨论】:
使用d-feet之类的工具检查NetworkManager运行实例的dbus接口。 【参考方案1】:方法名称是GetAccessPoints。
虽然你的错误是:
org.freedesktop.DBus.Error.UnknownMethod 带有签名的方法“GetAccessPoint” 界面上的“” “org.freedesktop.NetworkManager.Device.Wireless” 不存在
突出显示 “GetAccessPoint”。因此,您可能在代码中拼错了方法名称,尽管您在此处粘贴的代码使用了正确的方法名称,也许您已修复它并忘记重建或清理项目?
【讨论】:
【参考方案2】:我遇到了同样的问题,但后来我注意到它只发生在我在 有线 设备上调用 GetAccessPoints
方法时。确保设备是无线设备(即DeviceType
等于NM_DEVICE_TYPE_WIFI
),并且一切正常。
【讨论】:
【参考方案3】:我修改它并为我工作
QDBusInterface callNM("org.freedesktop.NetworkManager","/org/freedesktop/NetworkManager/Devices/0","org.freedesktop.NetworkManager.Device.Wireless",sysbus);
结果是
"/org/freedesktop/NetworkManager/AccessPoint/2"
"/org/freedesktop/NetworkManager/AccessPoint/1"
我认为/org/freedesktop/NetworkManager
不是特定设备(无线设备)的正确路径。
【讨论】:
【参考方案4】:QDBusInterface dbus_iface("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager/Devices/0", "org.freedesktop.NetworkManager.Device.Wireless", bus);
QDBusMessage query = dbus_iface.call("GetAccessPoints");
if(query.type() == QDBusMessage::ReplyMessage)
QDBusArgument arg = query.arguments().at(0).value<QDBusArgument>();
arg.beginArray();
while(!arg.atEnd())
QString element = qdbus_cast<QString>(arg);
netList->append(element);
showAccessPointProperties(element);
arg.endArray();
else
qDebug() << "got dbus error: " << query.errorName();
qDebug() << "check the parameters like service, path, interface and method name !!!";
希望这会有所帮助。
【讨论】:
来自我的 git 更多项目。 github.com/stoic1979/QtDbusNetworkManager以上是关于NetworkManager 和 Qt 问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 NetworkManager 和 Python 断开 WiFi 接入点
C++ Qt 从 QNetworkRequest 获取 HTTP 标头
linux系统重启网卡后网络不通(NetworkManager篇)