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-портов.

5 ответов5

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 ». Оно уникально для физического соединения и, как вы уже упоминали, изменится, если вы подключите устройство к другому порту.

2

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

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

1

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

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 позволяет использовать их все.

-1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .