Свойства интерфейса 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)

person Alex    schedule 03.06.2009    source источник


Ответы (3)


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

person daf    schedule 03.01.2010

Прежде всего, проверьте документацию и исходники 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».

person abbot    schedule 13.06.2009

Недавно я столкнулся с той же проблемой (не конкретно с Хэлом). Я не уверен, что это универсально, но его можно (по крайней мере, очень часто) получить через интерфейс 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
person Ryan Haining    schedule 09.06.2014