检测USB设备的问题

4 投票
1 回答
640 浏览
提问于 2025-04-16 20:45

我需要在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

我对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

撰写回答