web-dev-qa-db-ja.com

USBデバイスの識別

私は5台のUSBカメラ、同じブランド、同じモデル(Canyon CNR-FWC120H)を持っています。これらは、24時間年中無休でさまざまなシーンを監視するために使用されます。 Linux(Debian)コンソールまたはプログラム(任意の言語)から、どのカメラがどれであるかをどうにかして識別する必要があります。

lsusb -vvvの出力を見てみましたが、フィールドiSerialがあり、カメラごとに異なるはずですが、残念ながら、このメーカーは気にしないことに決め、すべてのカメラのシリアル番号は同じです。 :200901010001

残念ながら、私の特定のシナリオでは、同じカメラが常に同じポートに接続されるという事実に頼ることができないため、接続されているUSBポートとは関係なく、どのカメラがどのカメラであるかを識別する方法は他にありますか?.

[〜#〜] update [〜#〜]コメントで話し合った結果、これはミッションインポッシブルであることがわかりました。したがって、最後の段落を忘れるか、独創的なアイデアがある場合は、それを提示してください。デバイスが接続されているUSBポートを特定できるかどうか興味があります。マザーボードの内蔵USBポートと追加のPCIUSBコントローラーカードを使用して、十分な帯域幅のカメラに対応しています。ポートを一意に識別する必要があります。たとえば、マシンが再起動し、何らかの理由でUSBコントローラーが異なる順序で初期化された場合でも、ポート番号/識別は変更されません。それは可能ですか?

PDATE 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

カメラ間で異なるのは、DEVPATHID_PATHID_PATH_TAGPHYS、および(最も興味深い)USEC_INITIALIZEDです。ここで、最初の4つの要素はおそらくUSBポートに関連していますが、最後の要素USEC_INITIALIZEDはある種のシリアル番号のように見えます。それが実際に何を表しているのかについての情報が見つかりません。誰かがそれについて何か知っていますか?カメラが初期化されたのはマイクロ秒単位の時間かもしれないと思いましたが、この後に初期化されたカメラにはUSEC_INITIALIZED=17919751があり、その後にUSEC_INITIALIZED=25609278があるので、かなりランダムに見えます。システムを再起動して確認しますが、都合のよい時間待つ必要があります。

そして、なぜ私がカメラを再接続しようとしないのか疑問に思っている人がいたら、それが同じままかどうかを確認します。答えは、私はこのPCをリモートで操作しているということです。将来起こりうるイベントに対してシステムが完全に自律するように準備するために、これらすべてを調査しています。これには、たとえば、カメラをUSBポートから切断することが含まれる場合があります。

15
Ivan Kovacevic

あなたが発見したように、デバイス自体から一意のIDを取得できない場合、問題を解決することはできません。解決策に最も近いのは、ユニットの物理的な接続に依存することです。 (これは再起動時に変更されません。コネクタの位置を物理的に変更した場合のみ)

プログラムで、sysfsを使用して、デバイスに関するカーネルの情報を取得できます。 Sysfsは、カーネルがデバイスを認識するときのデバイスのファイルシステムのような表現です。 (ディスク上の実際のファイルではありません)

これを使用すると、次のことができます。-製品とベンダーIDでデバイスタイプを識別します-デバイスのシリアル番号(ある場合)を読み取ります。 -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__

/ 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を使用して、デバイスタイプを一意に識別できます。

serialファイルがあり、一意のシリアル番号が含まれている場合は、これで完了です。

それ以外の場合は、物理接続をIDとして使用するオプションがあります。これは、このディレクトリ名です。「4-1.5」これは物理接続に固有であり、デバイスをに接続すると、すでに述べたように変更されます。別のポート。

2
Simon Rigét

カメラは固定位置にありますか?シーンは多かれ少なかれ一定ですか?もしそうなら、代わりに彼らが見ているものによってカメラを識別するために画像認識を使用することができます。

これを行うためのいくつかのまともなpythonツールがあります、この答えはトピックに関するいくつかの良い情報を持っています: https://stackoverflow.com/questions/1927660/compare-two-images -the-python-linux-way

2
walli

カメラのプラグを抜き、1を差し込んで、lsusbを実行するだけです。カメラを特定し、使用されているUSBポートを書き留めます。たぶん、カムに小さなラベルを貼ってください。次に、他のカメラについて繰り返します。そうすれば、そこに着きます。ミッションインポッシブルはありません;)

1
Jakke

すべてのカメラを識別することが可能です。コマンド

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

カメラのシリアル番号を返します(Logitech HD Pro Webカメラ、以前のlsusbの使用から取得した正しいベンダー:製品コードの例として使用)。この操作は特権ユーザーとして実行する必要があることに注意してください。非特権ユーザーは、コマンドを介して利用可能なすべての情報にアクセスできるわけではありません。

シリアル番号は、常にではありませんが、多くの場合一意です。一意でない場合(同じVendor:Productコードを持つ2つのデバイスについて上記のコマンドの出力を比較するだけです)、次のようにsetできます。それらは明確です。それを行うためのガイドがグーグル中にあります、徹底するために、私はそれらのいくつかを単に指摘します: ここここ

今コマンド

$ 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デバイスでの試行とエラーにより、すべてのデバイスをピジョンホールすることができます。

0
MariusMatutiae