【问题标题】:USB devices UDev and D-BUSUSB 设备 UDev 和 D-BUS
【发布时间】:2011-07-03 20:26:31
【问题描述】:

我正在尝试获取 Ubuntu 10.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):

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

我们将不胜感激。先感谢您, 卡洛塔·罗密欧

【问题讨论】:

  • 为了将来的参考(我正在寻找这段代码,而不是通用的 USB 处理程序),您需要更改: iface = dbus.Interface(proxy, "org.freedesktop.UDisks.Device" ) 到 iface = dbus.Interface(proxy, "org.freedesktop.UDisks") 至少在使用 udisks 1.0.4 时。

标签: python linux ubuntu dbus udev


【解决方案1】:

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

【讨论】:

  • 感谢您的帮助,根据您的回答,我设法得到了一些工作。
  • 回调函数实际上是什么样子的?我没有找到有关device-addeddevice-changed 信号传递给回调的参数的信息。我想看看是否连接了具有特定idVendoridProduct 的设备并且可以使用一些帮助。提前致谢。
  • @con-f-use 如pyudev.glib 中所列,这两个信号将使用两个参数调用它们的回调,第二个参数是device,其属性位于device.attributes。跨度>
  • 我收到AttributeError: 'module' object has no attribute 'pygtk'。你能详细说明一下这个答案吗?是否可以从这里获取驱动器UUID,所以只有在添加特定驱动器时才能执行操作?
【解决方案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()

以下是 UDisk 的示例: python udisks - enumerating device information

【讨论】:

  • 依赖于 HAL,它已被弃用并且不再存在于最新的 Linux 发行版中。
  • @ephemient 是的,你是对的。但我认为使用“UDisks”不会有太大的不同。@Calota 我希望这对你有用
猜你喜欢
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2015-08-17
  • 2020-09-18
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
相关资源
最近更新 更多