【问题标题】:Can you retrieve a D-Bus property without calling org.freedesktop.DBus.Properties.Get?你能在不调用 org.freedesktop.DBus.Properties.Get 的情况下检索 D-Bus 属性吗?
【发布时间】: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()

【问题讨论】:

    标签: dbus


    【解决方案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.Getorg.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
    })
    

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

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 2019-05-05
      • 2015-08-17
      • 2012-09-19
      • 2023-04-06
      • 2015-08-18
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      相关资源
      最近更新 更多