Свойства интерфейса DBus - PullRequest
6 голосов
/ 03 июня 2009

Как получить список доступных свойств интерфейса 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)

Ответы [ 3 ]

3 голосов
/ 03 января 2010

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

2 голосов
/ 13 июня 2009

Прежде всего, проверьте документацию и источники халов, они всегда ваши друзья.

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.

0 голосов
/ 09 июня 2014

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