2009-06-03 10 views
5

Come si ottiene l'elenco delle proprietà dell'interfaccia DBus disponibili?Proprietà interfaccia DBus

Sto scrivendo uno script che seguirà il tipo specifico di connessioni di dispositivi USB. Un modo per distinguere le connessioni da tracciare da tutte le connessioni usb credo sia di controllare le proprietà delle interfacce dei segnali che DBus sta inviando su una connessione usb. Mi piacerebbe ottenere l'elenco di tutte queste proprietà per scegliere il relativo.

Il mio codice è:

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) 

risposta

2

Prima di tutto, controllare la documentazione Hal e le fonti, sono sempre tuo amico.

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

Come ultima risorsa puoi sempre trovare le proprietà che ti interessano con il comando 'lshal'.

2

In generale, è possibile utilizzare il metodo GetAll nell'interfaccia org.freedesktop.DBus.Properties.

0

Recentemente ho riscontrato lo stesso problema (non specificamente con Hal). Non sono sicuro che ciò sia valido in generale, ma può (almeno molto spesso) essere recuperato tramite l'interfaccia org.freedesktop.DBus.Properties (come suggerito da @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