我正试图通过Qt 5.12的DBus API向Connman发送以下消息:
dbus-send --system --print-reply --dest=net.connman / net.connman.Manager.SetProperty string:"OfflineMode" variant:boolean:true
如图所示,SetProperty
方法采用dbus字符串和dbus变体。
如果我用qdbus
查看签名,我得到以下内容:
$ qdbus --system net.connman / | grep Manager.SetProperty
method void net.connman.Manager.SetProperty(QString name, QDBusVariant value)
所以我就是这么做的…
iface.call("SetProperty", "OfflineMode", QDBusVariant(!m_flightModeOn));
然而,我得到以下编译错误:
error: no matching function for call to ‘QDBusInterface::call(const char [12], const char [12], QDBusVariant)’
QDBusReply<QVariantMap> reply = iface.call("SetProperty", "OfflineMode", QDBusVariant(true));
以下是完整的功能:
void enableFlightMode()
{
QDBusInterface iface("net.connman", "/", "net.connman.Manager", QDBusConnection::systemBus());
if (iface.isValid()) {
QDBusReply<QVariantMap> reply = iface.call("SetProperty", "OfflineMode", QDBusVariant(true));
}
qDebug() << qPrintable(QDBusConnection::systemBus().lastError().message());
}
我尝试过将bool
和QVariant
都传递给::call
,但这些都会导致DBus出现DBus错误:Method "SetProperty" with signature "sb" on interface "net.connman.Manager" doesn't exist
。这是有意义的,因为签名是一个字符串和一个变体。
我想我的问题是,根据Qt DBus API类型的系统文档,QDBusVariant((应该类似于DBus;VARIANT";,所以我希望能够将它传递到这个函数中。有没有其他方法可以通过这个API传递DBus变体?
我已经找到了一个使用API不同部分的解决方法。。。利用QDBusMessage,这可以做到:
QDBusMessage message = QDBusMessage::createMethodCall("net.connman", "/", "net.connman.Manager", "SetProperty");
QList<QVariant> arguments;
arguments << "OfflineMode" << QVariant::fromValue(QDBusVariant(true));
message.setArguments(arguments);
QDBusConnection::systemBus().call(message);
qDebug() << qPrintable(QDBusConnection::systemBus().lastError().message());
对于任何与康曼做类似事情的人,请查看cmst。它使用Qt通过DBus与Connman进行通信。