2013-08-14 8 views
6

कहें कि मैं अपने ईथरनेट कार्ड का इंटरफ़ेस नाम प्रोग्रामेटिक रूप से प्राप्त करना चाहता हूं।क्या आप org.freedesktop.DBus.Properties.Get को कॉल किए बिना डी-बस संपत्ति पुनर्प्राप्त कर सकते हैं?

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 

मैं पूछ फोन org.freedesktop.DBus.Properties.Get अजगर/जावा/आदि में एक object.getProp("someproperty")object.getSomeProperty() के बजाय फोन करने के लिए होने की तरह लग रहा है के लिए होने क्योंकि ।

उत्तर

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

की तरह है आंतरिक रूप से हर विधि कॉल/संकेत/जबाब सिर्फ बड़ा हस्ताक्षर (सेवा का नाम/वस्तु पथ/इंटरफेस) और के साथ एक संदेश है शरीर

4

हाँ, यदि आप qdbus का उपयोग करते हैं तो आप ऐसा कर सकते हैं। मैं मेरे साथ NetworkManager नहीं है, लेकिन ऐसे ही एक आदेश से काम करना चाहिए:

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

डी-बस से बात कर के लिए विभिन्न कमांड लाइन ग्राहकों रहे हैं, कुछ दूसरों की तुलना में अधिक सुविधाजनक हैं। मुझे पता है कि सूची की सूची यहां दी गई है।

  • dbus-send
  • gdbus (GLib द्वारा प्रदान की)
  • qdbus (क्यूटी द्वारा प्रदान की)
  • busctl (systemd द्वारा प्रदान की) (डी-बस अपने आप के साथ प्रदान की)
+1

यह शर्म की बात है कि सबसे अच्छा dbus कमांड लाइन उपकरण qt के साथ वितरित किया जाता है, और dbus नहीं। – olejorgenb

+1

यह ध्यान देने योग्य है कि, आंतरिक रूप से, 'qdbus' * * org.freedesktop.DBus.Properties.Get' या 'org.freedesktop.DBus.Properties.GetAll' को कॉल कर रहा है, या' org से सिग्नल से गुण प्राप्त कर रहा है .freedesktop.DBus.ObjectManager'। प्रोटोकॉल स्तर पर, यह एक आवश्यकता है। –

संबंधित मुद्दे

 संबंधित मुद्दे