USB-устройства UDev и D-BUS

Я пытаюсь получить список подключенных в настоящее время USB-устройств в Ubuntu 10.10 и отслеживать происходящие изменения, например, устройства, подключаемые или отключаемые с помощью UDev и D-BUS. Я новичок в программировании с использованием D-BUS. Я видел один пример: Linux: как обнаружить USB-клавиатура подключается и отключается только в том случае, если используется HAL, и я знаю, что HAL устарел. Я нашел некоторый рабочий код, немного изменил его, но он не работает ни на одном устройстве, а только на устройствах хранения, таких как USB-накопители, медиаплееры или устройства с компакт-дисками. Я хочу, чтобы мышки, клавиатуры, USB-камеры заряжали все, что подключено к USB. Я хочу, чтобы моя программа знала об этом. Это в основном то, что у меня есть ( http://moserei.de/2010/01/08/accessing-devicekit-with-dbus-and-python.html ):

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

def device_added_callback(device):
    print 'Device %s was added' % (device)

def device_changed_callback(device):
    print 'Device %s was changed' % (device)

#must be done before connecting to DBus
DBusGMainLoop(set_as_default=True)

bus = dbus.SystemBus()

proxy = bus.get_object("org.freedesktop.UDisks", 
                       "/org/freedesktop/UDisks")
iface = dbus.Interface(proxy, "org.freedesktop.UDisks.Device")

devices = iface.get_dbus_method('EnumerateDevices')()

print '%s' % (devices)

#addes two signal listeners
iface.connect_to_signal('DeviceAdded', device_added_callback)
iface.connect_to_signal('DeviceChanged', device_changed_callback)

#start the main loop
mainloop = gobject.MainLoop()
mainloop.run()

Любая помощь будет оценена. Заранее спасибо, Калота Ромео.


person Calota Romeo    schedule 24.02.2011    source источник
comment
Для дальнейшего использования (я искал именно этот код, а не общий обработчик USB), вам нужно изменить: iface = dbus.Interface(proxy, org.freedesktop.UDisks.Device) на iface = dbus.Interface(proxy, org.freedesktop.UDisks), по крайней мере, когда используется udisks 1.0.4.   -  person Miro Kropacek    schedule 27.11.2012


Ответы (2)


Служба udisks D-Bus, очевидно, сообщает только о дисках.

Просто отслеживайте udev напрямую (через libudev, через pyudev).

import pyudev
context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
observer = pyudev.pygtk.GUDevMonitorObserver(monitor)
observer.connect('device-added', device_added_callback)
observer.connect('device-changed', device_changed_callback)
monitor.enable_receiving()
mainloop = gobject.MainLoop()
mainloop.run()
person ephemient    schedule 24.02.2011
comment
Спасибо за помощь, мне удалось заставить что-то работать на основе вашего ответа. - person Calota Romeo; 26.02.2011
comment
Как на самом деле будет выглядеть функция обратного вызова? Я не нахожу информацию о параметрах, которые сигналы device-added и device-changed передают обратному вызову. Я хочу посмотреть, подключено ли устройство с определенными idVendor и idProduct, и мне может понадобиться помощь. Заранее спасибо. - person con-f-use; 01.09.2012
comment
@con-f-use Как указано на pyudev.glib, два сигнала будут вызывать свои обратные вызовы с двумя аргументами, второй из которых является устройство с атрибутами в device.attributes< /а>. - person ephemient; 01.09.2012
comment
Я получаю AttributeError: 'module' object has no attribute 'pygtk'. Можете ли вы немного уточнить этот ответ? Можно ли из этого получить диск UUID, чтобы можно было выполнять действие только при добавлении определенного диска? - person Redsandro; 03.01.2013

Это то, что я использую для списка уже подключенных флешек. Вы можете изменить скрипт под свои нужды

import dbus  
bus = dbus.SystemBus()

proxy = bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager")
iface = dbus.Interface(proxy, "org.freedesktop.Hal.Manager")

devices = iface.GetAllDevices ()

for device in devices:
  try:
      proxy1 = bus.get_object("org.freedesktop.Hal", device)
      iface1 = dbus.Interface(proxy1, "org.freedesktop.Hal.Device")
      props = iface1.GetAllProperties()

      removable = iface1.GetProperty("storage.removable")
      usb = iface1.GetProperty("storage.bus")
      if usb== "usb":
        print "\n".join(("%s: %s" % (k, props[k]) for k in props)) # shows available properties
  except:
    pass

И это то, что я использую, чтобы увидеть, подключен ли какой-либо usb:

#!/usr/bin/python
import dbus
import gobject

class DeviceAddedListener:
                def __init__(self):
                                self.bus = dbus.SystemBus()
                                self.hal_manager_obj = self.bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager")
                                self.hal_manager = dbus.Interface(self.hal_manager_obj,"org.freedesktop.Hal.Manager")

                                self.hal_manager.connect_to_signal("DeviceAdded", self._filter) 

                def _filter(self, udi):
                                device_obj = self.bus.get_object ("org.freedesktop.Hal", udi)
                                device = dbus.Interface(device_obj, "org.freedesktop.Hal.Device")
                                self.do_something(device)

                def do_something(self, device):
                                try:

                                                usb = device.GetProperty("storage.bus")
                                                info = device.GetProperty("info.product")
                                                removable = device.GetProperty("storage.removable")
                                                print info
                                except:
                                                pass#blah blah


if __name__ == '__main__':
                from dbus.mainloop.glib import DBusGMainLoop
                DBusGMainLoop(set_as_default=True)
                loop = gobject.MainLoop()
                DeviceAddedListener()
                loop.run()

Вот пример UDisks: python udisks - перечисление информации об устройстве

person savruk    schedule 25.02.2011
comment
Полагается на HAL, который устарел и больше не присутствует в новейших дистрибутивах Linux. - person ephemient; 25.02.2011
comment
@ephemient да, ты прав. Но я думаю, что использование UDisks не может быть таким разным. @Calota Я надеюсь, что это сработает для вас - person savruk; 28.02.2011