2009-06-03 4 views
5

Как получить список доступных свойств интерфейса DBus?Свойства интерфейса DBus

Я пишу скрипт, который будет отслеживать определенные типы подключений устройств USB. Способ отличить соединения для отслеживания со всех подключений usb, я думаю, это проверить свойства интерфейсов сигналов, которые DBus отправляет по USB-соединению. Я хотел бы получить список всех таких свойств, чтобы выбрать соответствующий.

Мой код:

import sys 
    import dbus 
    from dbus.mainloop.glib import DBusGMainLoop 
    import gobject 

    def deviceAdded(udi): 
     device = bus.get_object("org.freedesktop.Hal", udi) 
     device_if = dbus.Interface(device, 'org.freedesktop.Hal.Device') 
     if device_if.GetPropertyString('info.subsystem') == 'usb_device': 
      # 
      # Properties can be accesed like this: 
      # vendor_id = device_if.GetPropertyInteger('usb_device.vendor_id') 
      # 
      # how to get the list of all properties? 
      # 
      # do something 

    def deviceRemoved(udi): 
     # do something 
     pass 

    if __name__ == "__main__": 
    DBusGMainLoop(set_as_default=True) 
    bus = dbus.SystemBus() 

    bus.add_signal_receiver( 
     deviceAdded, 
     'DeviceAdded', 
     'org.freedesktop.Hal.Manager', 
     'org.freedesktop.Hal', 
     '/org/freedesktop/Hal/Manager') 

    bus.add_signal_receiver( 
     deviceRemoved, 
     'DeviceRemoved', 
     'org.freedesktop.Hal.Manager', 
     'org.freedesktop.Hal', 
     '/org/freedesktop/Hal/Manager') 

    loop = gobject.MainLoop() 

    try: 
     loop.run() 
    except KeyboardInterrupt: 
     print "usb-device-tracker: keyboad interrupt received, shutting down" 
     loop.quit() 
     sys.exit(0) 

ответ

2

Прежде всего, проверьте HAL документацию и источники, они всегда друг.

import dbus 
bus = dbus.SystemBus() 
dev = bus.get_object("org.freedesktop.Hal", u'/org/freedesktop/Hal/devices/computer_logicaldev_input') 
iface = dbus.Interface(dev, 'org.freedesktop.Hal.Device') 
props = iface.GetAllProperties() 
print "\n".join(("%s: %s" % (k, props[k]) for k in props)) 

В крайнем случае вы всегда можете найти интересующие вас объекты с командой 'lshal'.

2

В общем, вы можете использовать метод GetAll на интерфейсе org.freedesktop.DBus.Properties.

0

Недавно я столкнулся с той же проблемой (а не с Hal). Я не уверен, что это универсально, но можно (по крайней мере, очень часто) получить через интерфейс org.freedesktop.DBus.Properties (как предлагалось @daf).

bus = dbus.SystemBus() 
device = bus.get_object(...) 

your_interface = 'org.freedesktop.Hal.Device' # for this example 
props_iface = dbus.Interface(device, 'org.freedesktop.DBus.Properties') 
properties = props_iface.GetAll(your_interface) #properties is a dbus.Dictionary 
Смежные вопросы