2013-08-14 2 views
6

私のイーサネットカードのインターフェイス名をプログラムで取得したいとします。これが動作しているようです:org.freedesktop.DBus.Properties.Getを呼び出さずにD-Busプロパティを取得できますか?

返し
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 

戻り値:org.freedesktop.DBus.Properties.Getを呼び出すのPython/Javaの/ etcにあるobject.getProp("someproperty")代わりobject.getSomeProperty()のを呼び出すために持っているように見えるしたので、私は聞いて

Error org.freedesktop.DBus.Error.UnknownMethod: 
Method "Interface" with signature "" on interface 
"org.freedesktop.NetworkManager.Device" doesn't exist 

答えて

1

は、ほとんどのorg.freedesktop.DBus.Properties.GetAllあなたに同じ値を返しますが、内部的に、すべてのサービスがorg.freedesktop.DBus.Properties.Get/org.freedesktop.DBus.Properties.GetAllメソッド呼び出しとメッセージにハンドラなどのプロパティを実装します。

それが実際より、この擬似コードのよう

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 
}) 

あるため、内部のすべてのメソッド呼び出し/信号/応答が大きな署名(サービス名/オブジェクト・パス/インターフェース)とちょうどメッセージであるobject.getProp("someproperty")のように見えると本文

4

これは、qdbusを使用すると可能です。私は私と一緒にNetworkManagerを持っていませんが、そのようなコマンドが動作するはずです:

qdbus --system \ 
     org.freedesktop.NetworkManager \ 
     /org/freedesktop/NetworkManager/Devices/0 \ 
     org.freedesktop.NetworkManager.Device.Interface 

はD-BUSに話をするためのさまざまなコマンドライン・クライアントがあり、いくつかは他のものよりも便利です。ここに私が知っているもののリストがあります。

  • dbus-send
  • qdbus(Qtの提供)
  • gdbus(GLibの提供)
  • busctl(systemdに提供)(D-バス自体に付属)
+1

それは残念です最高のdbusコマンドラインツールがdbusではなくqtで配布されていることを確認してください。 – olejorgenb

+1

内部的に 'qdbus' *は' org.freedesktop.DBus.Properties.Get'または 'org.freedesktop.DBus.Properties.GetAll'を呼び出すことになるか、あるいはorgからのシグナルからプロパティを取得することに注意する価値があります.freedesktop.DBus.ObjectManager'。プロトコルレベルでは、これが要件です。 –

関連する問題