2013-08-14 2 views
6

Скажем, я хочу программно получить имя интерфейса моей карты ethernet. Это похоже на работу:Вы можете получить свойство D-Bus без вызова 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() в Python/Java/и т.д. ,

ответ

1

No.

Скорее всего 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 

Существуют различные командной строки клиенты для разговора с D-Bus, некоторые из них более удобны, чем другие. Вот список тех, которые я знаю.

  • dbus-send (при условии, с самого D-Bus)
  • gdbus (предоставленный БОЙКИМ)
  • qdbus (предоставленный Qt)
  • busctl (предоставленной Systemd)
+1

Это позор что лучший инструмент командной строки dbus распределяется с qt, а не dbus. – olejorgenb

+1

Стоит отметить, что внутренне 'qdbus' * будет * вызывать' org.freedesktop.DBus.Properties.Get' или 'org.freedesktop.DBus.Properties.GetAll' или получать свойства от сигналов от' org .freedesktop.DBus.ObjectManager'. На уровне протокола это требование. –

Смежные вопросы