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

呼び出す必要があるのは、Python/Java/etcではなくorg.freedesktop.DBus.Properties.Geta を呼び出す必要があるように見えるため です。object.getProp("someproperty")object.getSomeProperty()

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(systemd提供)
于 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 に答える