检测USB设备的问题
我需要在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