2011-02-24 11 views
15

Estoy tratando de obtener una lista de los dispositivos USB actualmente conectados en Ubuntu 10.10 y monitorear los cambios que ocurren, como los dispositivos que se enchufan o desconectan usando UDev y D-BUS. Soy bastante nuevo en la programación usando D-BUS. Vi un ejemplo: Linux : How to detect is usb keyboard is plugged and unplugged solo que uno usa HAL y sé que HAL está en desuso. Encontré un código de trabajo, lo modifiqué un poco, solo que no funciona para ningún dispositivo que solo tenga dispositivos de almacenamiento como memorias USB, reproductores de medios o dispositivos de CD-ROM. Quiero que todo el mouse, el teclado, el cargador de la cámara USB conecte cualquier cosa que esté conectada al USB. Quiero que mi programa lo sepa. Esto es básicamente lo que tengo (http://moserei.de/2010/01/08/accessing-devicekit-with-dbus-and-python.html):Dispositivos USB UDev y D-BUS

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

Cualquier ayuda sería muy apreciada. Gracias de antemano, Calota Romeo

+1

Para la referencia futura (Estaba buscando exactamente este código, no un controlador usb genérico), necesita cambiar: iface = dbus.Interface (proxy, "org.freedesktop.UDisks.Device") a iface = dbus.Interface (proxy, "org.freedesktop.UDisks") al menos cuando se usa udisks 1.0.4. –

Respuesta

10

El servicio D-Bus udisks, obviamente, solo informa de los discos.

Simplemente supervisa udev directamente (a través de libudev, a través de 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() 
+0

Gracias por la ayuda que pude obtener algo que funciona en función de su respuesta. –

+0

¿Cómo se vería la función de devolución de llamada? No encuentro información sobre los parámetros que las señales 'device-added' y' device-changed' pasan a la devolución de llamada. Quiero ver si un dispositivo con un 'idVendor' específico y' idProduct' está conectado y podría necesitar algo de ayuda. Gracias por adelantado. –

+0

@ con-f-use Como figura en [pyudev.glib] (http://pyudev.readthedocs.org/en/latest/api/glib.html), esas dos señales invocarán sus devoluciones de llamada con dos argumentos, el segundo de los cuales es un [dispositivo] (http://pyudev.readthedocs.org/en/latest/api/pyudev.html#pyudev.Device) con atributos en ['device.attributes'] (http: //pyudev.readthedocs .org/en/latest/api/pyudev.html # pyudev.Device.attributes). – ephemient

2

Esto es lo que uso para enumerar las memorias flash ya conectadas. Puede modificar la escritura a sus necesidades

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 

y esto es lo que uso para ver si alguno USB conectado:

#!/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() 

Aquí está el ejemplo de udisks: python udisks - enumerating device information

+2

Se basa en HAL, que está en desuso y ya no está presente en las distribuciones de Linux más recientes. – ephemient

+0

Ese wa mi problema también. De todos modos, gracias por la ayuda. –

+0

@ephemient sí, tienes razón. Pero creo que el uso de "UDisk" no puede ser tan diferente. @ Calota Espero que esto funcione para ti – savruk

Cuestiones relacionadas