Como você descobriu, o problema não pode ser resolvido se você não conseguir uma identificação única do próprio dispositivo. O mais próximo de uma solução é depender da conexão física da unidade. (Isso não mudará na reinicialização. Somente se você alterar fisicamente a posição do conector)
Programaticamente, você pode usar o sysfs para obter as informações que o kernel possui sobre o dispositivo. O Sysfs é uma representação de dispositivos semelhante ao sistema de arquivos, conforme o kernel os vê. (Não é arquivos reais no disco)
Com isso, você pode:
- identificar o tipo de dispositivo com o produto e o ID do fornecedor
- leia o número de série do dispositivo, se tiver um.
- leia o número de conexão física no hub USB
Você pode começar encontrando seu tipo de dispositivo em / sys / class. Neste exemplo eu uso uma porta USB → LPT. Mas o princípio é o mesmo.
$ 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
Grap o nome do dispositivo do arquivo uevent:
cat /sys/class/usbmisc/lp1/uevent
MAJOR=180
MINOR=1
DEVNAME=__usb/lp1__
adicione / dev para que o nome do dispositivo seja aberto: / dev / usb / lp1
Use o caminho real:
$ cd -P / sys / class / usbmisc / lp1
Recue 3 filiais:
$ cd ../../../
/sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5
Este diretório contém muitas informações sobre o dispositivo:
idProduct e idVendor podem ser usados para identificar de forma exclusiva o tipo de dispositivo.
Se houver um arquivo serial e ele contiver um número de série exclusivo, está pronto.
Caso contrário, sua opção é usar a conexão física como identificação, que é o nome do diretório “ 4-1.5 ”. Ele é exclusivo para a conexão física e, como você já mencionou, mudará se você conectar o dispositivo em outra porta.