У меня пять 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-портов.
Ответы:
Камеры находятся в фиксированном положении? Сцены более или менее постоянны? Если это так, вы можете использовать распознавание изображений, чтобы идентифицировать камеры по тому, что они видят вместо этого.
Для этого есть несколько хороших инструментов python, в этом ответе есть хорошая информация по этой теме: /programming/1927660/compare-two-images-the-python-linux-way
источник
Как вы обнаружили, проблема не может быть решена, если вы не можете получить уникальную идентификацию от самого устройства. Самое близкое решение - это зависит от физического соединения устройства. (Это не изменится при перезагрузке. Только если вы физически измените положение разъема)
Программно вы можете использовать sysfs для получения информации об устройстве, имеющейся в ядре. Sysfs - это представление устройств в файловой системе в том виде, в котором их видит ядро. (Это не настоящие файлы на диске)
С его помощью вы можете: - идентифицировать тип устройства с помощью идентификатора продукта и поставщика - прочитать серийный номер устройства, если оно есть. - прочитать номер физического соединения на USB-концентраторе
Вы можете начать с поиска вашего типа устройств в / sys / class. В этом примере я использую порт USB → LPT. Но принцип тот же.
Получите имя устройства из файла событий:
добавьте / dev, чтобы вы открыли имя устройства: / dev / usb / lp1
Используйте реальный путь: $ cd -P / sys / class / usbmisc / lp1
Шаг назад 3 ветки:
Этот каталог содержит много информации об устройстве:
idProduct и idVendor могут быть использованы для уникальной идентификации типа устройства.
Если есть серийный файл, и он содержит уникальный серийный номер, все готово.
В противном случае вы можете использовать физическое соединение в качестве идентификации, то есть это имя каталога « 4-1.5 ». Оно уникально для физического соединения и, как вы уже упоминали, изменится, если вы подключите устройство к другому порту.
источник
Просто отключите камеру, подключите 1 и выполните lsusb. Определите камеру и запишите, какой порт USB используется. Может быть, поставить небольшую метку на камеру. Затем повторите для другой камеры, и вы получите там. Нет ничего невозможного в миссии;)
источник
Можно идентифицировать все камеры. Команда
возвращает серийный номер моей камеры (веб-камера Logitech HD Pro, используемая в качестве примера с правильным поставщиком: коды продуктов, полученные при предыдущем использовании
lsusb
). Обратите внимание, что абсолютно необходимо выполнить эту операцию как привилегированный пользователь: непривилегированный пользователь не получает доступ ко всей информации, доступной через команду.Серийный номер часто, но не всегда, уникален. Если он не уникален (просто сравните вывод приведенных выше команд для двух устройств с одним и тем же поставщиком: коды продуктов), вы можете установить их так, чтобы они были различны. По всему Google есть руководства для этого, я просто укажу на пару из них, ради тщательности: здесь и здесь .
Теперь команда
возвращает соответствующие коды для этой конкретной камеры.
/dev/videoX
Метод проб и ошибок на всех устройствах позволяет разводить их всех.источник
Я слышал, что кто-то последовательно откладывает включение устройств во время загрузки, что позволит вам идентифицировать их по порядку их включения. Это потребовало бы дополнительного оборудования, которое могло бы управлять питанием отдельных USB-портов по порядку.
Вы можете взломать USB-концентратор, который имеет отдельные выключатели питания для каждого порта, подключить его к Arduino и инициировать, в каком порядке они включены.
источник