6

假设我想以编程方式获取以太网卡的接口名称。这似乎有效:

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

我问是因为必须调用 org.freedesktop.DBus.Properties.Get看起来必须调用 aobject.getProp("someproperty")而不是object.getSomeProperty()在 Python/Java/等中。

4

2 回答 2

4

是的,如果您使用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(系统提供)
于 2014-05-14T21:08:51.473 回答
1

不。

很可能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
})

在内部,每个方法调用/信号/回复只是一条带有大签名(服务名称/对象路径/接口)和正文的消息

于 2013-08-16T00:33:28.060 回答