首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >USB设备UDev和D-BUS

USB设备UDev和D-BUS
EN

Stack Overflow用户
提问于 2011-02-25 04:11:16
回答 2查看 18.3K关注 0票数 15

我正在尝试获取Ubuntu10.10中当前插入的USB设备的列表,并监控发生的变化,比如使用UDev和D-BUS插入或拔出的设备。我是使用D-BUS编程的新手。我看到了一个例子:Linux : How to detect is usb keyboard is plugged and unplugged只使用了HAL,我知道HAL已被弃用。我找到了一些可以工作的代码,对它进行了一些修改,但它不适用于任何设备,只适用于存储设备,如usb记忆棒、媒体播放器或cd-rom设备。我想要所有的东西,鼠标,键盘,usb摄像头,充电器,任何插在USB上的东西,我想让我的程序知道它。这基本上就是我所拥有的( http://moserei.de/2010/01/08/accessing-devicekit-with-dbus-and-python.html ):

代码语言:javascript
复制
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()

任何帮助都会被感谢。先谢谢你,卡洛塔·罗密欧

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-25 06:45:28

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

只需直接监控udev (通过libudev,通过pyudev)。

代码语言:javascript
复制
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()
票数 10
EN

Stack Overflow用户

发布于 2011-02-26 00:15:02

这是我用来列出已经插入闪存盘的东西。您可以根据需要修改脚本

代码语言:javascript
复制
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插头的方法:

代码语言:javascript
复制
#!/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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5109879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档