私はlibusbを使用して、いくつかのusbデバイスを列挙します。今、私は「デバイスパス」を取得するのが好きです。私はグーグルで成功しなかったので、私はそれがusbdevice-pathと呼ばれていないと思います。
USBデバイスをLinuxに接続すると、にメッセージが表示されます。これは、USB温度センサー(このようなもの)を使用したこのdmesg
ような「デバイスパス」の例です。
USBポートに直接:
[68448.099682] generic-usb 0003:0C45:7401.0056: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.0-1/input0
=> 12.0-1
別のポートに直接:
[68560.853108] generic-usb 0003:0C45:7401.0058: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:13.0-1/input0
=> 13.0-1
最初に使用されたポートのUSBハブへ:
[68600.245809] generic-usb 0003:0C45:7401.005A: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4/input0
=> 12.2-1.4
同じUSBハブの別のポートへ:
[68647.925092] generic-usb 0003:0C45:7401.005C: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.3/input0
=> 12.2-1.3
以前に使用されたusbハブ上のusbハブへの今:
[68740.715518] generic-usb 0003:0C45:7401.005E: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4.4/input0
=> 12.2-1.4.4
簡単に言うと、カーネルメッセージには、物理的なUSBデバイスの場所への一意のパスが常に含まれています(前の太字のテキストを参照)。libusbを介してユーザースペースでこの「パス」を取得することは可能ですか?struct usb_bus
とで色んなことをやってみましstruct usb_device
たが、いつも失敗しました。
これらのUSB温度計の複数を識別するためにこれが必要です。これは、一意のシリアル番号がなく、実行時に「再接続」するだけで、異なるUSBIDを取得する場合があるためです。ですから、それらを識別する唯一の方法は、物理的な場所を経由することだと思います。
助けてくれてありがとう、
よろしくケビンM。
-編集-
現在、次のコードを使用してUSBデバイスを検索しています。
usb_dev_handle *find_lvr_winusb() {
struct usb_bus *bus;
struct usb_device *dev;
for (bus = usb_busses; bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
if (dev->descriptor.idVendor == VENDOR_ID &&
dev->descriptor.idProduct == PRODUCT_ID ) {
usb_dev_handle *handle;
if(debug) {
printf("lvr_winusb with Vendor Id: %x and Product Id: %x found.\n", VENDOR_ID, PRODUCT_ID);
printf("INFO: %d\n", dev->bus->location);
printf("INFO: %d %s\n", bus->location, bus->dirname);
}
if (!(handle = usb_open(dev))) {
printf("Could not open USB device\n");
return NULL;
}
return handle;
}
}
}
return NULL;
}
しかし、このコードでは、一意の物理位置IDを取得できません。はbus->location
整数を返します(bus-> dirnameには同じものが含まれますが、文字列として)。これは一意ではありません。私はusbに階層があり、dmesg
iでこの階層パスを見ることができることを知っています。
libusbを使用すると、バスID(?)と一部のデバイスIDしか取得できません。しかし、これらの温度センサーを2つ以上識別する必要があるため、役に立ちません。温度センサーが接続をリセットし(5〜60秒ごと)、バスIDが一意でない場合、デバイスIDは常に変化します。残念ながら、温度センサーには一意のシリアルIDがありません。
したがって、物理パスがデバイスを識別する唯一の方法だと思います。
よろしくケビンM。