2013-08-14 16 views
6

Programlı olarak ethernet kartımın arayüz adını almak istediğimi söyle. döndürürorg.freedesktop.DBus.Properties.Get'i çağırmadan D-Bus özelliği alabilir misiniz?

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" 

aracıyı org.freedesktop.DBus.Properties.Get kesmek bazı yolu var mı ve daha doğrudan özelliğini almaya Bu iş gibi görünüyor? Ne yazık ki, bir yöntem olarak çağırarak çalışmaz:

dbus-send --print-reply \ 
      --type=method_call \ 
      --system \ 
      --dest=org.freedesktop.NetworkManager \ 
      /org/freedesktop/NetworkManager/Devices/0 \ 
      org.freedesktop.NetworkManager.Device.Interface 

İade: org.freedesktop.DBus.Properties.Get çağrı Python/Java/vb bir object.getProp("someproperty") yerine object.getSomeProperty() arasında aramak zorunda benziyor zorunda çünkü sormak

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

.

cevap

1

Büyük olasılıkla org.freedesktop.DBus.Properties.GetAll size aynı değeri döndürecektir sayılı

ama içten her hizmet org.freedesktop.DBus.Properties.Get/ org.freedesktop.DBus.Properties.GetAll yöntem çağrılarıyla iletilere işleyicileri gibi özellikleri uygulamak. aslında daha bu sözde kod

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

gibidir çünkü

O Dahili olarak her yöntem çağrısı/sinyal/Cevap büyük imza (hizmet adı/nesne yolu/arayüz) ve sadece bir mesajdır object.getProp("someproperty") benziyor body

4

Evet, qdbus kullanırsanız bunu yapabilirsiniz. Yanımda NetworkManagerı yok, ama böyle bir komut çalışması gerekir:

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

D-Bus konuştuğu için çeşitli komut satırı istemcisi vardır, bazıları diğerlerinden daha uygundur. İşte tanıdığımların listesi.

  • dbus-send
  • qdbus (Qt tarafından sağlanan)
  • gdbus (GLib'in tarafından sağlanan)
  • busctl (systemd tarafından sağlanan) (D-Bus kendisi ile sağlanan)
+1

çok yazık En iyi dbus komut satırı aracı dt değil, qt ile dağıtılır. – olejorgenb

+1

İçinde 'qdbus' * 'ın * org.freedesktop.DBus.Properties.Get' veya' org.freedesktop.DBus.Properties.GetAll' işlevini çağıracağı ya da 'org'dan gelen sinyalleri aldığını .freedesktop.DBus.ObjectManager'. Protokol düzeyinde, bu bir gerekliliktir. –

İlgili konular