Identificazione dei dispositivi USB


15

Ho cinque fotocamere USB, stessa marca, stesso modello (Canyon CNR-FWC120H). Sono utilizzati per monitorare diverse scene 24/7. Devo in qualche modo identificare quale telecamera è quale dalla console Linux (Debian) o programmaticamente (qualsiasi lingua).

Ho provato a guardare l'output di lsusb -vvv, c'è un campo iSerialche dovrebbe essere diverso per ogni telecamera ma sfortunatamente questo produttore ha deciso di non disturbare e tutte le telecamere hanno lo stesso seriale in quel posto:200901010001

Esiste un altro modo per identificare quale fotocamera è quale indipendentemente dalle porte USB a cui sono collegate perché purtroppo nel mio scenario specifico non posso fare affidamento sul fatto che la stessa fotocamera sarà sempre collegata alla stessa porta.

AGGIORNAMENTO Dopo alcune discussioni nei commenti mi rendo conto che questa missione è impossibile. Quindi dimentica l'ultimo paragrafo o se hai qualche idea geniale, per favore, sei il benvenuto a presentarlo. Ora sono interessato se potessi identificare a quale porta USB è collegato il dispositivo; Uso le porte USB integrate sulla scheda madre e le schede controller PCI USB aggiuntive per ospitare le telecamere con una larghezza di banda sufficiente. Dovrei identificare in modo univoco la porta e il numero / identificazione della porta non dovrebbe cambiare se, ad esempio, la macchina si riavvia e per qualche motivo i controller USB vengono inizializzati in ordine diverso. È possibile?

AGGIORNAMENTO 2 Vedo nei miei registri per una delle telecamere le seguenti informazioni:

[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

Usando quello, ho chiamato questo comando:

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

E ottenuto questo:

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

Le cose che differiscono tra le telecamere sono DEVPATH, ID_PATH, ID_PATH_TAG, PHYSe (più interessante) USEC_INITIALIZED. Ora i primi quattro elementi sono probabilmente correlati alla porta USB, ma l'ultimo USEC_INITIALIZEDsembra una sorta di numero seriale. Non riesco a trovare informazioni su ciò che rappresenta effettivamente. Qualcuno ne sa qualcosa a riguardo? Ho pensato che fosse forse il tempo in micro secondi quando la fotocamera è stata inizializzata, ma la fotocamera che si è inizializzata dopo questa ha USEC_INITIALIZED=17919751, e poi quella successiva, USEC_INITIALIZED=25609278quindi sembra piuttosto casuale. Proverò a riavviare il sistema e vedere, ma devo aspettare un momento opportuno per farlo.

E se qualcuno si sta chiedendo perché non provo semplicemente a ricollegare una videocamera e vedere se rimane lo stesso. La risposta è che sto usando questo PC da remoto, e sto indagando su tutto questo per preparare il sistema ad essere completamente autonomo per qualsiasi potenziale evento in futuro. Che per esempio potrebbe includere la disconnessione delle telecamere dalle porte USB.


Può essere anche non programmatico / non software? ad esempio, contrassegnando il vetro anteriore della fotocamera con un pennarello (colori diversi)? Se non ci sono differenze nell'hardware e / o nei seriali, dubito che ciò sarà possibile senza una riprogrammazione personalizzata, tuttavia è possibile collegare la videocamera tramite relè / hub che SONO diversi?
Gizmo,

Purtroppo no per l'idea del marcatore, perché non devo presentare nulla all'immagine stessa. Mi chiedevo se esiste la possibilità di sovrascrivere il numero di serie della telecamera? O qualsiasi altra impostazione / informazione sulla fotocamera ... Esiste qualcosa del genere? Memoria scrivibile e persistente?
Ivan Kovacevic,

Questo sarà davvero difficile, specialmente quando non viene fornita alcuna informazione univoca per il dispositivo, vedi questo: stackoverflow.com/questions/14053764/… . Per quanto riguarda la sovrascrittura della memoria, potresti provare a trovare un'utilità di flashing del firmware, identificare il seriale nel firmware e modificarlo su qualcosa che ti piace? Tuttavia non riesco a trovare alcuno strumento. Se riesci a trovare un modo per cambiare il descrittore del dispositivo USB, sarebbe facile da lì in poi.
Gizmo,

Puoi provare lo strumento HID Descriptor qui - usb.org/developers/hidpage - Ofcourse , solo se la tua videocamera è HID
Gizmo

accidenti, credo che sia impossibile, non esiste anche un firmware per questo modello, quindi anche questa idea è venuta fuori. Immagino che l'unica cosa che potrei fare è imporre che ogni telecamera rimanga sempre connessa alla stessa porta sul PC ... Modificherò la mia domanda.
Ivan Kovacevic,

Risposte:


2

Le telecamere sono fisse? Le scene sono più o meno costanti? In tal caso, è possibile utilizzare il riconoscimento delle immagini per identificare le telecamere in base a ciò che stanno visualizzando.

Ci sono alcuni strumenti Python decenti per farlo, questa risposta ha alcune buone informazioni sull'argomento: /programming/1927660/compare-two-images-the-python-linux-way


Avevo in mente questa soluzione, tuttavia speravo in qualcosa di più semplice. E avrei un problema perché poche telecamere si affacciano su un porto affollato, le navi si muovono, la superficie del mare non è costante a causa delle onde, ecc.
Ivan Kovacevic,

2

Come hai scoperto, il problema non può essere risolto se non è possibile ottenere un'identificazione univoca dal dispositivo stesso. La cosa più vicina a una soluzione è dipendere dalla connessione fisica dell'unità. (Questo non cambierà al riavvio. Solo se si cambia fisicamente la posizione del connettore)

A livello di programmazione è possibile utilizzare sysfs per ottenere le informazioni sul kernel relative al dispositivo. Sysfs è una rappresentazione dei dispositivi simile a un file system come li vede il kernel. (Non sono file reali sul disco)

Con esso, è possibile: - identificare il tipo di dispositivo con ID prodotto e fornitore - leggere il numero seriale del dispositivo, se ne ha uno. - leggere il numero di connessione fisica sull'hub USB

Puoi iniziare trovando il tuo tipo di dispositivi in ​​/ sys / class. In questo esempio utilizzo una porta USB → LPT. Ma il principio è lo stesso.

$ 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

Prendi il nome del dispositivo dal file uevent:

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

aggiungi / dev in modo da ottenere il nome del dispositivo da aprire: / dev / usb / lp1

Usa il vero percorso: $ cd -P / sys / class / usbmisc / lp1

Fai un passo indietro di 3 rami:

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

Questa directory contiene molte informazioni sul dispositivo:

idProduct e idVendor possono essere utilizzati per identificare in modo univoco il tipo di dispositivo.

Se esiste un file seriale e contiene un numero seriale univoco, il gioco è fatto.

Altrimenti l'opzione è quella di utilizzare la connessione fisica come identificazione, che è il nome di questa directory “ 4-1.5 ”. È univoco per la connessione fisica e, come già accennato, cambierà se si collega il dispositivo a un'altra porta.


Immagino che questa sia la soluzione migliore o un compromesso nel mio caso ... Fissare le fotocamere alla stessa porta USB dedicata. Dico compromesso perché nel mio caso avevo anche l'obbligo di identificare le telecamere se, ad esempio, dopo una manutenzione hardware, le telecamere fossero collegate a porte diverse dalla persona che esegue la manutenzione.
Ivan Kovacevic,

Sono d'accordo. Questo è tutt'altro che perfetto. Vorrei che fosse comune per i fornitori aggiungere un semplice ... numero seriale al dispositivo, come specificato dal protocollo. Spero che trovi una soluzione migliore!
Simon Rigét,

1

Basta scollegare la fotocamera, collegare 1 e fare un lsusb. Identificare la fotocamera e annotare quale porta USB viene utilizzata. Forse mettere una piccola etichetta sulla cam. Quindi ripeti l'operazione per l'altra fotocamera e arriverai lì. Niente è impossibile;)


Questo ha senso. Basta collegare una videocamera alla volta e notare a quale porta fisica è collegata. Sembra che potresti persino attivare e disattivare le singole porte se non riesci a differenziare all'interno del tuo software, quindi ne comparirebbe solo una alla volta. Vedi askubuntu.com/questions/342061/…
Ryan Griggs,

Ammetto di non aver spiegato completamente lo scopo della mia configurazione. È un PC in una posizione remota utilizzato per la registrazione di intervalli di tempo (mesi) di lunga durata. Ho desiderato una soluzione che potesse identificare automaticamente le telecamere senza il mio intervento. Ora dopo un'interruzione di corrente devo effettivamente accedere e riconfigurare manualmente i numeri della telecamera.
Ivan Kovacevic,

0

È possibile identificare tutte le telecamere. Il comando

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

restituisce il numero di serie della mia videocamera (una webcam Logitech HD Pro, utilizzata come esempio con il fornitore corretto: codici prodotto ottenuti da un precedente utilizzo di lsusb). Si noti che è assolutamente necessario eseguire questa operazione come utente privilegiato: un utente non privilegiato non ottiene l'accesso a tutte le informazioni disponibili tramite il comando.

Il numero di serie è spesso, ma non sempre, unico. Se non è univoco (basta confrontare l'output dei comandi precedenti per due dispositivi con lo stesso fornitore: codici prodotto), è possibile impostarli in modo che siano distinti. Ci sono guide in tutto Google per farlo, ne indicherò solo un paio, per ragioni di completezza: qui e qui .

Ora il comando

$ 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

restituisce i codici appropriati per questa fotocamera specifica. Prove ed errori con tutti i /dev/videoXdispositivi consentono di far passare tutti i piccioni.


Mi sembra che forse non hai letto il mio post iniziale della domanda fino alla fine. Nel mio post ho già menzionato l'uso di udevadm ... Il problema è che tutte le telecamere hanno lo stesso numero di serie, quindi non è possibile distinguerle da quelle informazioni. Hai detto "puoi impostarli in modo che siano distinti" c'è un modo per "impostare" / modificare il numero seriale?
Ivan Kovacevic,

-1

Ho sentito di qualcuno che ha ritardato l'accensione in sequenza dei dispositivi durante un avvio, il che ti consentirebbe di identificarli in base all'ordine in cui si accendono. Richiederebbe un hardware aggiuntivo che potrebbe controllare l'alimentazione delle singole porte USB in ordine.

È possibile hackerare un hub USB con interruttori di alimentazione individuali per ciascuna porta, collegarlo a un arduino e attivare l'ordine in cui sono accesi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.