Идентификация USB-устройств

15

У меня пять USB-камер той же марки, той же модели (Canyon CNR-FWC120H). Они используются для мониторинга различных сцен 24/7. Мне нужно как-то определить, какая камера какая из консоли Linux (Debian) или программно (любой язык).

Я попытался посмотреть на вывод lsusb -vvv, есть поле, iSerialкоторое должно быть различным для каждой камеры, но, к сожалению, этот производитель решил не беспокоиться, и все камеры имеют один и тот же серийный номер в этом месте:200901010001

Есть ли какой-нибудь другой способ определить, какая камера и какие порты подключены независимо от USB-портов, потому что, к сожалению, в моем конкретном сценарии я не могу полагаться на тот факт, что одна и та же камера всегда будет подключена к одному и тому же порту.

ОБНОВЛЕНИЕ После некоторого обсуждения в комментариях я понимаю, что это миссия невыполнима. Так что забудьте о последнем абзаце или, если у вас есть оригинальная идея, пожалуйста, не стесняйтесь представить ее. Теперь мне интересно, смогу ли я определить, к какому USB-порту подключено устройство; Я использую встроенные порты USB на материнской плате и дополнительные платы контроллера USB USB для размещения камер с достаточной пропускной способностью. Мне нужно было бы однозначно идентифицировать порт, и номер порта / идентификация не должны меняться, если, например, машина перезагружается и по какой-то причине контроллеры USB инициализируются в другом порядке. Это возможно?

ОБНОВЛЕНИЕ 2 Я вижу в своих журналах для одной из камер следующую информацию:

[Wed Apr 30 18:35:02 2014] uvcvideo: Found UVC 1.00 device FULL HD 1080P Webcam (0bda:58b0)
[Wed Apr 30 18:35:02 2014] input: FULL HD 1080P Webcam as /devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4

Используя это, я вызвал эту команду:

udevadm info --query=all --path=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4

И получил это:

P: /devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4
E: DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4
E: EV=3
E: ID_BUS=usb
E: ID_INPUT=1
E: ID_INPUT_KEY=1
E: ID_MODEL=FULL_HD_1080P_Webcam
E: ID_MODEL_ENC=FULL\x20HD\x201080P\x20Webcam
E: ID_MODEL_ID=58b0
E: ID_PATH=pci-0000:01:00.0-usb-0:2:1.0
E: ID_PATH_TAG=pci-0000_01_00_0-usb-0_2_1_0
E: ID_REVISION=5801
E: ID_SERIAL=Generic_FULL_HD_1080P_Webcam_200901010001
E: ID_SERIAL_SHORT=200901010001
E: ID_TYPE=video
E: ID_USB_DRIVER=uvcvideo
E: ID_USB_INTERFACES=:0e0100:0e0200:010100:010200:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Generic
E: ID_VENDOR_ENC=Generic
E: ID_VENDOR_ID=0bda
E: KEY=100000 0 0 0
E: MODALIAS=input:b0003v0BDAp58B0e5801-e0,1,kD4,ramlsfw
E: NAME="FULL HD 1080P Webcam"
E: PHYS="usb-0000:01:00.0-2/button"
E: PRODUCT=3/bda/58b0/5801
E: PROP=0
E: SUBSYSTEM=input
E: UDEV_LOG=3
E: USEC_INITIALIZED=41090223

Вещи , которые отличаются между камерами DEVPATH, ID_PATH, ID_PATH_TAG, PHYSи (самым интересным) USEC_INITIALIZED. Теперь первые четыре элемента, вероятно, связаны с портом USB, но последний USEC_INITIALIZEDвыглядит как своего рода серийный номер. Я не могу найти информацию о том, что это на самом деле представляет. Кто-нибудь знает что-нибудь об этом? Я подумал, что это может быть время в микросекундах, когда камера инициализировалась, но камера, которая инициализировалась после этой USEC_INITIALIZED=17919751, а затем та, что после, USEC_INITIALIZED=25609278кажется довольно случайной. Я попытаюсь перезагрузить систему и посмотреть, но мне нужно подождать подходящего времени, чтобы сделать это.

И если кому-то интересно, почему я просто не пытаюсь снова подключить камеру и посмотреть, остается ли это прежним. Ответ заключается в том, что я управляю этим ПК удаленно и изучаю все это, чтобы подготовить систему к полной автономности для любого потенциального события в будущем. К примеру, это может включать отключение камер от USB-портов.

Иван Ковачевич
источник
Может ли это быть непрограмматическим / не программным тоже? например, пометив переднее стекло камеры маркером (разные цвета)? Если нет различий в оборудовании и / или серийных номерах, то я сомневаюсь, что это будет возможно без специального перепрограммирования, однако вы могли бы подключить камеру через реле / ​​концентраторы, которые отличаются?
Gizmo
К сожалению, нет идеи маркера, потому что я не должен ничего вводить в саму картинку. Мне было интересно, есть ли возможность перезаписать серийный номер камеры? Или любая другая настройка камеры / информация ... Есть ли что-то подобное? Пишущая, постоянная память?
Иван Ковачевич
Это будет очень сложно, особенно если не предоставлена ​​уникальная информация для устройства, смотрите здесь: stackoverflow.com/questions/14053764/… . Что касается перезаписи памяти, вы можете попытаться найти утилиту для прошивки прошивки, определить серийный номер в прошивке и HEX-EDIT на то, что вам нравится? Однако я не могу найти никаких инструментов для этого. Если вы можете найти способ изменить дескриптор устройства USB, то это будет легко с этого момента.
Gizmo
Вы можете попробовать инструмент HID Descriptor здесь - usb.org/developers/hidpage - Конечно, только если ваша камера HID
Gizmo
блин, да, я думаю, что это невозможно, также нет прошивки для этой модели, так что идея тоже отсутствует. Полагаю, единственное, что я мог сделать, - это обеспечить, чтобы каждая камера была постоянно подключена к одному и тому же порту на ПК ... Я изменю свой вопрос.
Иван Ковачевич

Ответы:

2

Камеры находятся в фиксированном положении? Сцены более или менее постоянны? Если это так, вы можете использовать распознавание изображений, чтобы идентифицировать камеры по тому, что они видят вместо этого.

Для этого есть несколько хороших инструментов python, в этом ответе есть хорошая информация по этой теме: /programming/1927660/compare-two-images-the-python-linux-way

Walli
источник
Я имел в виду это решение, однако я надеялся на что-то более простое. И у меня была бы проблема, потому что немногие камеры фактически пропускают занятый порт, движущиеся корабли, морская поверхность не постоянна из-за волн и т. Д.
Иван Ковачевич
2

Как вы обнаружили, проблема не может быть решена, если вы не можете получить уникальную идентификацию от самого устройства. Самое близкое решение - это зависит от физического соединения устройства. (Это не изменится при перезагрузке. Только если вы физически измените положение разъема)

Программно вы можете использовать sysfs для получения информации об устройстве, имеющейся в ядре. Sysfs - это представление устройств в файловой системе в том виде, в котором их видит ядро. (Это не настоящие файлы на диске)

С его помощью вы можете: - идентифицировать тип устройства с помощью идентификатора продукта и поставщика - прочитать серийный номер устройства, если оно есть. - прочитать номер физического соединения на USB-концентраторе

Вы можете начать с поиска вашего типа устройств в / sys / class. В этом примере я использую порт USB → LPT. Но принцип тот же.

$ ls -l /sys/class/usbmisc
lp1 -> ../../devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5:1.0/usbmisc/lp1
lp2 -> ../../devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.6/4-1.6:1.0/usbmisc/lp2

Получите имя устройства из файла событий:

cat /sys/class/usbmisc/lp1/uevent
MAJOR=180
MINOR=1
DEVNAME=__usb/lp1__

добавьте / dev, чтобы вы открыли имя устройства: / dev / usb / lp1

Используйте реальный путь: $ cd -P / sys / class / usbmisc / lp1

Шаг назад 3 ветки:

$ cd ../../../
/sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5

Этот каталог содержит много информации об устройстве:

idProduct и idVendor могут быть использованы для уникальной идентификации типа устройства.

Если есть серийный файл, и он содержит уникальный серийный номер, все готово.

В противном случае вы можете использовать физическое соединение в качестве идентификации, то есть это имя каталога « 4-1.5 ». Оно уникально для физического соединения и, как вы уже упоминали, изменится, если вы подключите устройство к другому порту.

Саймон Ригет
источник
Я думаю, что это лучшее решение или компромисс в моем случае ... Закрепите камеры на одном и том же выделенном USB-порту. Я говорю о компромиссе, потому что в моем случае у меня также было требование идентифицировать камеры, если, например, после технического обслуживания камеры человек будет выполнять техническое обслуживание, он будет подключен к различным портам.
Иван Ковачевич
Я согласен. Это далеко не идеально. Я хотел бы, чтобы поставщики обычно добавляли к устройству простой ... серийный номер, как указано в протоколе. Я надеюсь, что вы найдете лучшее решение!
Саймон Ригет
1

Просто отключите камеру, подключите 1 и выполните lsusb. Определите камеру и запишите, какой порт USB используется. Может быть, поставить небольшую метку на камеру. Затем повторите для другой камеры, и вы получите там. Нет ничего невозможного в миссии;)

Jakke
источник
Это имеет смысл. Просто подключите одну камеру за раз и отметьте, к какому физическому порту она подключена. Похоже, вы могли бы даже включать и выключать отдельные порты, если вы не можете различить в своем программном обеспечении, поэтому только один будет отображаться одновременно. См. Askubuntu.com/questions/342061/…
Райан Григгс
Я признаю, что не объяснил полностью ясно цель моей конфигурации. Это удаленный компьютер, используемый для записи длительных промежутков времени (месяцев). Я хотел найти решение, которое могло бы автоматически идентифицировать камеры без моего вмешательства. Теперь после любого отключения питания мне нужно войти в систему и вручную перенастроить номера камер.
Иван Ковачевич
0

Можно идентифицировать все камеры. Команда

 $ sudo lsusb -v -d 046d:082d | grep -i serial
   iSerial                 1 05C6D16F

возвращает серийный номер моей камеры (веб-камера Logitech HD Pro, используемая в качестве примера с правильным поставщиком: коды продуктов, полученные при предыдущем использовании lsusb). Обратите внимание, что абсолютно необходимо выполнить эту операцию как привилегированный пользователь: непривилегированный пользователь не получает доступ ко всей информации, доступной через команду.

Серийный номер часто, но не всегда, уникален. Если он не уникален (просто сравните вывод приведенных выше команд для двух устройств с одним и тем же поставщиком: коды продуктов), вы можете установить их так, чтобы они были различны. По всему Google есть руководства для этого, я просто укажу на пару из них, ради тщательности: здесь и здесь .

Теперь команда

$ sudo udevadm info --query=all /dev/video1 | grep 'VENDOR_ID\|MODEL_ID\|SERIAL_SHORT'
  E: ID_MODEL_ID=082d
  E: ID_SERIAL_SHORT=05C6D16F
  E: ID_VENDOR_ID=046d

возвращает соответствующие коды для этой конкретной камеры. /dev/videoXМетод проб и ошибок на всех устройствах позволяет разводить их всех.

MariusMatutiae
источник
Мне кажется, что вы, возможно, не прочитали мой первоначальный вопрос пост до конца. Я уже упоминал в своем посте об использовании udevadm ... Проблема в том, что все камеры имеют одинаковый серийный номер, поэтому вы не можете отличить их от этой информации. Вы упомянули «вы можете установить их так, чтобы они были различны», есть ли способ «установить» / изменить серийный номер?
Иван Ковачевич
-1

Я слышал, что кто-то последовательно откладывает включение устройств во время загрузки, что позволит вам идентифицировать их по порядку их включения. Это потребовало бы дополнительного оборудования, которое могло бы управлять питанием отдельных USB-портов по порядку.

Вы можете взломать USB-концентратор, который имеет отдельные выключатели питания для каждого порта, подключить его к Arduino и инициировать, в каком порядке они включены.

zimmer62
источник