私は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
カメラ間で異なるのは、DEVPATH
、ID_PATH
、ID_PATH_TAG
、PHYS
、および(最も興味深い)USEC_INITIALIZED
です。ここで、最初の4つの要素はおそらくUSBポートに関連していますが、最後の要素USEC_INITIALIZED
はある種のシリアル番号のように見えます。それが実際に何を表しているのかについての情報が見つかりません。誰かがそれについて何か知っていますか?カメラが初期化されたのはマイクロ秒単位の時間かもしれないと思いましたが、この後に初期化されたカメラにはUSEC_INITIALIZED=17919751
があり、その後にUSEC_INITIALIZED=25609278
があるので、かなりランダムに見えます。システムを再起動して確認しますが、都合のよい時間待つ必要があります。
そして、なぜ私がカメラを再接続しようとしないのか疑問に思っている人がいたら、それが同じままかどうかを確認します。答えは、私はこのPCをリモートで操作しているということです。将来起こりうるイベントに対してシステムが完全に自律するように準備するために、これらすべてを調査しています。これには、たとえば、カメラをUSBポートから切断することが含まれる場合があります。
あなたが発見したように、デバイス自体から一意の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」これは物理接続に固有であり、デバイスをに接続すると、すでに述べたように変更されます。別のポート。
カメラは固定位置にありますか?シーンは多かれ少なかれ一定ですか?もしそうなら、代わりに彼らが見ているものによってカメラを識別するために画像認識を使用することができます。
これを行うためのいくつかのまともなpythonツールがあります、この答えはトピックに関するいくつかの良い情報を持っています: https://stackoverflow.com/questions/1927660/compare-two-images -the-python-linux-way
カメラのプラグを抜き、1を差し込んで、lsusbを実行するだけです。カメラを特定し、使用されているUSBポートを書き留めます。たぶん、カムに小さなラベルを貼ってください。次に、他のカメラについて繰り返します。そうすれば、そこに着きます。ミッションインポッシブルはありません;)
すべてのカメラを識別することが可能です。コマンド
$ 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
デバイスでの試行とエラーにより、すべてのデバイスをピジョンホールすることができます。