2013-08-14 23 views
6

Powiedz, że chcę programowo uzyskać nazwę interfejsu mojej karty Ethernet. To wydaje się działać:Czy można pobrać właściwość D-Bus bez wywoływania 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 

Które zwraca:

method return sender=:1.5 -> dest=:1.135 reply_serial=2 
    variant  string "eth0" 

Czy istnieje jakiś sposób na wycinanie pośrednika org.freedesktop.DBus.Properties.Get i odzyskać własność bardziej bezpośrednio? Niestety, nazywając go jako metoda nie działa:

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

Powroty:

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

Pytam ponieważ konieczności wzywania org.freedesktop.DBus.Properties.Get wygląda konieczności wezwać object.getProp("someproperty") zamiast object.getSomeProperty() w Python/Java/etc .

Odpowiedz

1

nr

Najprawdopodobniej org.freedesktop.DBus.Properties.GetAll zwróci ci tę samą wartość, ale wewnętrznie każda usługa wdrożenia właściwości jak ładowarki do wiadomości z org.freedesktop.DBus.Properties.Get/org.freedesktop.DBus.Properties.GetAll wywołań metod.

Wygląda object.getProp("someproperty") ponieważ faktycznie jest bardziej jak ten pseudo-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 
}) 

Wewnętrznie każda metoda wezwanie/sygnał/odpowiedź jest tylko komunikat z dużym podpisem (nazwa usługi/przedmiot ścieżka/interface) oraz body

4

Tak, możesz to zrobić, jeśli używasz qdbus. Nie mam NetworkManagera ze mną, ale komenda tak powinno działać:

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

Istnieją różne klienci wiersza polecenia do rozmowy z D-Bus, niektóre są bardziej wygodne niż inne. Oto lista tych, które znam.

  • dbus-send (wyposażona samego D-Bus)
  • gdbus (dostarczone przez GLib)
  • qdbus (dostarczone przez Qt)
  • busctl (dostarczone przez Systemd)
+1

się wstyd że najlepsze narzędzie wiersza poleceń dbus jest dystrybuowane z qt, a nie dbus. – olejorgenb

+1

Warto zauważyć, że wewnętrznie 'qdbus' * będzie * wywoływać' org.freedesktop.DBus.Properties.Get' lub 'org.freedesktop.DBus.Properties.GetAll' lub uzyskiwać właściwości z sygnałów z' org ' .freedesktop.DBus.ObjectManager'. Na poziomie protokołu jest to wymagane. –