USBデバイスの識別


15

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

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

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

更新コメントの中でいくつかの議論の後、私はこれが使命不可能であることを理解しています。最後の段落は忘れてください。独創的なアイデアをお持ちの場合は、ぜひご紹介ください。デバイスが接続されているUSBポートを特定できるかどうかに興味があります。マザーボードの組み込みUSBポートと追加のPCI USBコントローラカードを使用して、十分な帯域幅のカメラに対応しています。ポートを一意に識別する必要があります。たとえば、マシンが再起動し、何らかの理由でUSBコントローラーが異なる順序で初期化された場合、ポート番号/識別は変更されません。それは可能ですか?

更新2カメラの1つのログに次の情報が表示されます。

[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ポートからカメラを切断することが含まれます。


それは非プログラム的/非ソフトウェアでもありますか?たとえば、カメラのフロントガラスにマーカー(異なる色)でマークを付けますか?ハードウェアおよび/またはシリアルに違いがない場合、カスタムの再プログラミングなしでこれが可能になるとは思いませんが、異なるリレー/ハブを介してカメラを接続できますか?
ギズモ14

残念ながら、マーカーのアイデアはありません。写真自体に何も紹介してはいけません。カメラのシリアル番号を上書きする可能性があるのだろうか?または他のカメラ設定/情報...そのような何かが存在しますか?書き込み可能な永続メモリ?
イヴァンコバセビッチ14

これは、特にデバイスの固有の情報が提供されていない場合、非常に困難になります。これを参照してください:stackoverflow.com/questions/14053764/… メモリの上書きに関しては、ファームウェアフラッシュユーティリティを見つけて、ファームウェア内のシリアルを特定し、好きなように16進編集しますか?ただし、そのためのツールが見つかりません。USBデバイス記述子を変更する方法を見つけることができれば、それ以降は簡単です。
ギズモ14

あなたはここにHIDディスクリプタツールを試すことができます- usb.org/developers/hidpage -勿論、あなたのカムはHIDの場合のみ
ギズモ

いまいましい、これは不可能だと思います。このモデルにはファームウェアもありませんので、アイデアも出ています。私ができる唯一のことは、各カメラが常にPCの同じポートに接続されていることを強制することだと思います...私は質問を修正します。
イヴァンコヴァセビッチ14

回答:


2

カメラは固定されていますか?シーンはほぼ一定ですか?その場合、画像認識を使用して、代わりにカメラが見ているものでカメラを識別することができます。

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


私はこの解決策を念頭に置いていましたが、もっと簡単なものを望んでいました。忙しい港や船が動いているのを実際に見ているカメラがほとんどなく、波などのために海面が一定でないため、問題が発生します。
Ivan Kovacevic 14

2

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

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

ある場合は、シリアルファイルと、それは固有のシリアル番号が含まれている、あなたが行われています。

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


これが最良の解決策、または私の場合の妥協案だと思います...カメラを同じ専用USBポートに固定します。私の場合、たとえばハードウェアのメンテナンス後、カメラがメンテナンスを行う人によって別のポートに接続される場合、カメラを識別する必要もあったため、妥協案を言います。
イヴァンコヴァセビッチ

同意する。これは完璧にはほど遠い。プロトコルで指定されているように、デバイスに単純なシリアル番号を追加することは、ベンダーにとって一般的だったと思います。より良い解決策を見つけることを願っています!
サイモンリジェ16年

1

カメラのプラグを抜き、1を差し込んでlsusbを実行します。カメラを特定し、使用されているUSBポートを書き留めます。カムに小さなラベルを貼るかもしれません。次に、他のカメラについても同じ手順を繰り返します。不可能な使命はありません;)


意味あり。一度に1台のカメラを接続するだけで、どの物理ポートに接続されているかをメモします。ソフトウェア内で区別できない場合は、個々のポートのオンとオフを切り替えることもできるため、一度に1つしか表示されないようです。askubuntu.com/questions/342061/を
ライアングリッグス

構成の目的を完全に明確に説明しなかったことは認めます。これは、長時間(月)のタイムラプスを記録するために使用される遠隔地にあるPCです。私は、介入なしでカメラを自動的に識別できるソリューションを望んでいました。停電後、実際にログインし、カメラ番号を手動で再構成する必要があります。
イヴァンコバ

0

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

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

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

シリアル番号は、常にではありませんが、しばしば一意です。一意でない場合(同じVendor:Productコードを持つ2つのデバイスの上記コマンドの出力を比較するだけ)、それらが異なるように設定できます。それを行うためのすべての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ポートへの電力を順番に制御できる追加のハードウェアが必要になります。

各ポートに個別の電源スイッチがあるUSBハブをハックし、それをarduinoにフックして、オンになっている順序をトリガーできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.