你能在不调用 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.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
)

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

【讨论】:

以上是关于你能在不调用 org.freedesktop.DBus.Properties.Get 的情况下检索 D-Bus 属性吗?的主要内容,如果未能解决你的问题,请参考以下文章

你能在不同的线程上调用相同的方法吗?

你能在同一个提交的一个函数中有两个ajax调用吗?

你能在 Java 中抛出啥?

你能在 SQL 中定义“文字”表吗?

你能在 ClutterStage 中嵌入 GtkWidgets 吗?

你能在 UIViewController 类中实现 Accessibility 方法吗?