USB设备 UDev和D-BUS
我想在Ubuntu 10.10系统中获取当前插入的USB设备列表,并监控设备的变化,比如设备被插入或拔出。我对使用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()
任何帮助都将不胜感激。提前谢谢你,
Calota Romeo
2 个回答
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 - 列举设备信息
11
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()