Ідентифікація USB-пристроїв


15

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

Я спробував подивитися на вихід lsusb -vvv, є поле, iSerialяке повинно бути різним для кожної камери, але, на жаль, цей виробник вирішив не турбуватись, і всі камери мають однаковий серій в цьому місці:200901010001

Чи є інший спосіб, який я міг би визначити, яка камера, яка незалежно від портів USB, до яких вони підключені, тому що, на жаль, в моєму конкретному сценарії я не можу покластися на те, що одна і та ж камера завжди буде підключена до одного порту.

ОНОВЛЕННЯ Після деяких обговорень у коментарях я розумію, що це місія неможлива. Тож забудьте останній абзац, або якщо у вас є якась геніальна ідея, будь ласка, можете запросити його. Мене зараз цікавить, чи зможу я визначити, до якого порту USB підключено пристрій; Я використовую вбудовані USB-порти на материнській платі та додаткові плати USB-контролера PCI для розміщення камер з достатньою пропускною здатністю. Мені потрібно буде однозначно ідентифікувати порт, і номер порту / ідентифікація не повинна змінюватися, якщо, наприклад, машина перезавантажиться і чомусь 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


Це рішення я мав на увазі, проте сподівався на щось простіше. І я мав би проблему, оскільки мало камер насправді виходять на зайнятий порт, кораблі рухаються, морська поверхня не є постійною через хвилі тощо
Іван Ковачевич

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

Візьміть назву пристрою з файлу uevent:

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

add / 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-порту. Я кажу про компроміс, тому що в моєму випадку я також мав вимогу ідентифікувати камери, якщо, наприклад, після технічного обслуговування обладнання камери будуть підключатись до різних портів особою, яка займається технічним обслуговуванням.
Іван Ковачевич

Я згоден. Це далеко не ідеально. Я хочу, щоб постачальникам було звично додавати до пристрою f ... простий порядковий номер, як зазначено в протоколі. Сподіваюся, ви знайдете краще рішення!
Simon Rigét

1

Просто від'єднайте шнур від камери, підключіть 1 і зробіть lsusb. Визначте камеру та запишіть, який порт USB використовується. Можливо, поставте на кулачок трохи мітки. Потім повторіть для іншої камери, і ви туди потрапите. Ніщо не є місією неможливою;)


Це має сенс. Просто підключіть одну камеру за раз і відзначте, до якого фізичного порту вона прикріплена. Схоже, ви навіть можете вмикати та вимикати окремі порти, якщо ви не зможете розмежувати свої програми, тому одночасно може з’являтися лише один. Дивіться askubuntu.com/questions/342061/…
Ryan Griggs

Зізнаюся, я не пояснив повністю чіткої мети своєї конфігурації. Це ПК у віддаленому місці, який використовується для запису тривалих (місячних) проміжок часу. Я побажав рішення, яке могло б автоматично визначити камери без мого втручання. Тепер після будь-якого відключення електроенергії я фактично повинен увійти та вручну перенастроїти номери камер.
Іван Ковачевич

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пристроями дозволяють затамувати їх усіх.


Мені здається, наче ви, можливо, не дочитали мого початкового запитання до кінця. Я вже згадував у своєму дописі про використання udevadm ... Проблема полягає в тому, що всі камери мають однаковий серійний номер, тому ви не можете сказати їх, крім цієї інформації. Ви згадали "ви можете встановити їх так, щоб вони були різними", чи є спосіб "встановити" / змінити серійний номер?
Іван Ковачевич

-1

Я чув, як хтось затримував послідовно ввімкнення живлення на пристрої під час завантаження, що дозволило б ідентифікувати їх на основі порядку, який вони включають. Для цього знадобиться деяке додаткове обладнання, яке могло б керувати живленням окремих портів по порядку.

Ви можете зламати USB-концентратор, який має індивідуальні перемикачі живлення для кожного порту, підключити його до ардуїно і запустити, в якому порядку вони включені.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.