2016年03月20日

同じUSBデバイスが複数ある時にデバイスを識別する

全く同じUSBデバイスが複数繋がっている時、特定の1つを指定するにはどうすればいいか困っていた。
ベンダーID・プロダクトIDが異なっていればudevでデバイス名を固定すればいいのだが、同じだとどうやら固定できなさそう。そもそも/dev配下にデバイスとして見えないものはどうすればいいのか。
具体的にはUSB温度計が複数繋がっている時。
USBのデバイス番号で読み取り先の温度計を指定できるものの、USBのデバイス番号は毎回変わるので、決め打ちで一意に指定できない。

lsusbでUSBデバイスの接続状況が見られるわけだが、'lsusb'だとバス・デバイス番号・デバイスIDが、'lsusb -t'だと、カスケードされたハブの接続とその先のデバイス番号が分かる。
そこで、例えば
+PCのUSBポート
|
+---ハブ1--+--エレコムのカメラ
| +--USB温度計
|
+---ハブ2--+--バッファローのカメラ
+--USB温度計

こんな感じに機器が繋がっているならば、

”エレコムのカメラと同じハブに繋がってるUSB温度計”
”バッファローのカメラと同じハブに繋がってるUSB温度計”

という特定の仕方をすれば、USB温度計のデバイス番号が一意に求められる(別にカメラじゃなくても、ベンダーID・プロダクトIDが違っていれば何でもいいけど)。
よって、まず lsusb -t の出力でツリー構造を分析して、ルートからどうハブを経由しているかとデバイス番号を紐付けして、その結果をlsusbの出力でデバイス番号とベンダーID・プロダクトIDを紐付けすれば、”エレコムのカメラと同じハブに繋がってるUSB温度計”が分かるようになるだろう。

ということで、lsusb -tとlsusbの出力結果を解析して、接続されている場所・デバイス番号・デバイスIDを列挙するコードをPHPで書いてみた。

https://github.com/usoinfo/usb_device_list

初めてgithubを使ってみた。
使い方のサンプルは、 sample.php にあります。
タグ:PHP USB
posted by usoinfo at 10:26 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする