2011-02-24 94 views
15

我试图获取列表中的USB设备在Ubuntu 10.10当前插入和监控发生变化,比如或缩小使用udev和d-BUS被插入的设备。我对使用D-BUS编程相当陌生。我看到一个例子:Linux : How to detect is usb keyboard is plugged and unplugged只有一个使用HAL,我知道HAL已被弃用。我发现了一些工作代码,稍加修改,只适用于任何设备,如USB棒,媒体播放器或光盘设备。我希望整个事情鼠标,键盘,USB相机充电器任何插入到USB我想我的程序知道它。这基本上就是我所拥有的(http://moserei.de/2010/01/08/accessing-devicekit-with-dbus-and-python.html):USB设备udev和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() 

任何帮助都会被认可。预先感谢您, Calota罗密欧

+1

供未来参考(我正在寻找这个代码,而不是通用的USB处理程序),您需要更改: iface = dbus.Interface(proxy,“org.freedesktop.UDisks.Device”) 至少在使用udisks 1.0.4时,iface = dbus.Interface(代理,“org.freedesktop.UDisks”) 到 。 – 2012-11-27 10:26:24

回答

10

udisks D-Bus服务,显然,只报告磁盘。

只是Monitor的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() 
+0

感谢您的帮助,我设法根据您的答案找到工作。 – 2011-02-26 14:20:45

+0

回调函数如何看起来像?我没有找到有关'device-added'和'device-changed'信号传递给回调参数的信息。我想查看是否连接了具有特定'idVendor'和'idProduct'的设备,并且可以使用一些帮助。提前致谢。 – 2012-08-31 22:48:43

+0

@ CON-F-使用成为[pyudev.glib](http://pyudev.readthedocs.org/en/latest/api/glib.html),这两个信号将调用它们的回调有两个参数,第二列其中[device.attributes']是属于[device](http://pyudev.readthedocs.org/en/latest/api/pyudev.html#pyudev.Device)(http://pyudev.readthedocs .ORG/EN /最新/ API/pyudev.html#pyudev.Device.attributes)。 – ephemient 2012-08-31 23:10:27

2

这是我用来列出已插入的闪存棒。您可以修改脚本,以您的需求

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 - enumerating device information

+2

依赖HAL,它已被弃用,不再出现在最新的Linux发行版中。 – ephemient 2011-02-25 17:19:10

+0

这也是我的问题。无论如何thx的帮助。 – 2011-02-26 14:20:19

+0

@ephemient是的,你是对的。但我认为使用“UDisks”不可能如此不同。@ Calota我希望这适合你 – savruk 2011-02-28 07:39:22