你能在不调用 org.freedesktop.DBus.Properties.Get 的情况下检索 D-Bus 属性吗?
Posted
技术标签:
【中文标题】你能在不调用 org.freedesktop.DBus.Properties.Get 的情况下检索 D-Bus 属性吗?【英文标题】:Can you retrieve a D-Bus property without calling org.freedesktop.DBus.Properties.Get? 【发布时间】:2013-08-17 02:59:19 【问题描述】:假设我想以编程方式获取以太网卡的接口名称。这似乎有效:
dbus-send --print-reply \
--type=method_call \
--system \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/Devices/0 \
org.freedesktop.DBus.Properties.Get \
string:org.freedesktop.NetworkManager.Device \
string:Interface
返回:
method return sender=:1.5 -> dest=:1.135 reply_serial=2
variant string "eth0"
有没有什么方法可以去掉中间人org.freedesktop.DBus.Properties.Get
并更直接地检索属性?唉,把它当作方法调用是行不通的:
dbus-send --print-reply \
--type=method_call \
--system \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/Devices/0 \
org.freedesktop.NetworkManager.Device.Interface
返回:
Error org.freedesktop.DBus.Error.UnknownMethod:
Method "Interface" with signature "" on interface
"org.freedesktop.NetworkManager.Device" doesn't exist
我问是因为在 Python/Java/etc 中必须调用 org.freedesktop.DBus.Properties.Get
看起来必须调用 object.getProp("someproperty")
而不是 object.getSomeProperty()
。
【问题讨论】:
【参考方案1】:是的,如果您使用 qdbus,您可以做到这一点。我没有 NetworkManager,但这样的命令应该可以工作:
qdbus --system \
org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/Devices/0 \
org.freedesktop.NetworkManager.Device.Interface
有多种用于与 D-Bus 对话的命令行客户端,有些比其他的更方便。这是我知道的名单。
dbus-send
(由 D-Bus 本身提供)
gdbus
(GLib 提供)
qdbus
(Qt提供)
busctl
(由systemd提供)
【讨论】:
可惜最好的dbus命令行工具是用qt分发的,而不是dbus。 值得注意的是,在内部,qdbus
将调用org.freedesktop.DBus.Properties.Get
或org.freedesktop.DBus.Properties.GetAll
,或者从org.freedesktop.DBus.ObjectManager
的信号中获取属性。在协议级别,这是一项要求。【参考方案2】:
没有。
org.freedesktop.DBus.Properties.GetAll
很可能会返回相同的值,但在内部每个服务都将属性作为处理程序来处理带有 org.freedesktop.DBus.Properties.Get
/org.freedesktop.DBus.Properties.GetAll
方法调用的消息。
看起来像object.getProp("someproperty")
,因为它实际上更像这个伪代码
bus.handleMessage(
service: "org.freedesktop.NetworkManager",
object: "/org/freedesktop/NetworkManager/Devices/0",
iface: "org.freedesktop.NetworkManager.Device.Interface",
body: [ "org.freedesktop.NetworkManager.Device", "Interface"],
thisMessageIsReplyTo: null
)
在内部,每个方法调用/信号/回复只是一条带有大签名(服务名称/对象路径/接口)和正文的消息
【讨论】:
以上是关于你能在不调用 org.freedesktop.DBus.Properties.Get 的情况下检索 D-Bus 属性吗?的主要内容,如果未能解决你的问题,请参考以下文章