关于检测usb设备的问题

时间:2011-07-03 19:51:46

标签: python usb dbus

我需要在插入和拔出插头时检测一个USB设备,然后用dbus写一个python程序。

但是,设备在插拔电源时至少安装三次是非常奇怪的

监视器代码如下:

            device = dbus.Interface(self.bus.get_object("org.freedesktop.Hal", udi),
                                    "org.freedesktop.Hal.Device")

            self.notify_message(device.GetProperty("info.udi"))

然后当我尝试插入USB设备(例如键盘)时我们捕获输出

Mon Jul  4 03:47:31 2011    /org/freedesktop/Hal/devices/usb_device_413c_2003_noserial

Mon Jul  4 03:47:31 2011    /org/freedesktop/Hal/devices/usb_device_413c_2003_noserial_if0

Mon Jul  4 03:47:31 2011    /org/freedesktop/Hal/devices/usb_device_413c_2003_noserial_if0_logicaldev_input

因此,每次插入或拔出插头时,通知都会显示三次 如何只显示一次通知?

1 个答案:

答案 0 :(得分:0)

我不熟悉dbus,但请查看您获得的设备名称:

usb_device_413c_2003_noserial
usb_device_413c_2003_noserial_if0
usb_device_413c_2003_noserial_if0_logicaldev_input

第一个设备可能代表整个USB设备。第二个设备很可能代表所述设备的接口0。第三个设备可能代表接口0的端点或某些其他功能,可能会或可能不会在设备的描述符中指定。

即使仅插入一个物理设备,您也可以获得三种不同的逻辑设备。对于实现复合USB设备的人来说,这类事情很重要。

要回答这个问题,但是:如果您只想收到一次通知,那么在您的通知处理程序功能中,您应该通过查看设备名称字符串并决定是否过滤掉您不关心的通知关心事件与否。例如,您可能会决定不关心名称中包含if0的设备,因此您的伪代码将是:

def notificationHandler(notification)
  if notification.name does not contain `if0`
    pass notification to higher level code
  end
end