проблема с обнаружением usb устройства - PullRequest
4 голосов
/ 03 июля 2011

Мне нужно обнаружить USB-устройство, когда оно было подключено и отключено, и я пишу программу на python с помощью dbus.

Но очень странно, что устройство будет монтироваться как минимум три раза, когда оно подключено или отключено

код монитора следующий:

            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 голосов
/ 04 июля 2011

Я не знаком с 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
...