linux / libusb obtenir périphérique usb chemin
- Je utiliser libusb pour énumérer sur quelques appareils usb. Maintenant, je voudrais obtenir le "device-chemin". Je pense qu'il ne s'appelle pas de périphérique usb-chemin, parce que je n'ai pas été en réussite avec google.
Si je connecter un dispositif usb avec linux, je reçois un message dans dmesg
, voici quelques exemples pour un "appareil-chemin" avec un port usb capteur de température (quelque chose comme cette):
Directement à un port 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
Directement à un autre port:
[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
À un hub usb sur le premier port utilisé:
[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
À un autre port sur le même hub 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
Un maintenant à un hub usb sur le hub usb utilisé avant:
[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
Longue histoire courte:
Les messages du noyau contient toujours un chemin d'accès unique pour la physique usb, emplacement de l'appareil (voir le texte en gras avant). Est-il possible d'obtenir ce "chemin" dans l'espace utilisateur via libusb? J'ai essayé beaucoup de choses avec struct usb_bus
et struct usb_device
, mais j'ai toujours été en vain.
J'ai besoin de ce pour identifier plusieurs de ces usb thermomètres, parce qu'ils n'ont pas un numéro de série unique et parfois, ils ont juste "reconnecter" au moment de l'exécution, afin qu'ils obtiennent usb différent de l'id. Donc, je pense que le seul moyen de les identifier est par l'intermédiaire de l'emplacement physique.
Merci pour l'aide,
Cordialement
Kevin M.
-edit-
Actuellement j'utilise le code suivant à la recherche de mon périphérique 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;
}
Mais avec ce code, je ne peux pas obtenir un physique unique id position. Le bus->location
renvoie un entier (bus->nom du dossier contient les mêmes, mais comme une chaîne de caractères), ce qui n'est pas unique. Je sais usb a une hiérarchie et dans le dmesg
je peux voir ce hierarchys chemin.
Avec libusb je ne peux prendre le bus-id (?) et certains d'id de périphérique. Mais ils ne m'aide pas, parce que j'ai besoin d'identifier deux ou plusieurs de ces capteurs de température. Le device-id change toujours, lorsque le capteur de température de réinitialisation de la connexion (tous les 5 à 60 secondes) et l'id de bus n'est pas unique. Malheureusement, le capteur de température n'a pas de série unique id.
Donc je pense que le chemin d'accès physique est le seul moyen d'identifier l'appareil.
Cordialement
Kevin M.
OriginalL'auteur Kevin Meier | 2013-01-11
Vous devez vous connecter pour publier un commentaire.
Depuis libusb 1.0.12, ils ont introduit libusb_get_port_path(), et dans 1.0.16 remplacé par libusb_get_port_numbers() qui vous permet d'interroger la topologie en bus.
libusb_get_device_address
pour/dev/input/eventX
libusb.sourceforge.net/api-1.0/...OriginalL'auteur ndyer
Ensemble estival du sysfs structure path:
Plus d'informations ici
Voulez-vous dire de n'importe quelle version de Windows? Mais il semble que cela ne fonctionne pas sur XP sp3. C'est mon problème github.com/libusb/libusb/issues/113. Pouvez-vous me donner des suggestions?
OriginalL'auteur premal
Il est possible, comme ici.
Suffit de scanner tous les périphériques USB à tous les autobus. Lorsque vous trouvez nécessaire VID/PID — c'est votre appareil.
Ou vous pouvez faire plus simple: écrire un udev-règle qui permettrait de créer un lien symbolique /dev/thermoX lorsque vous fixez votre appareil. Tout ce que vous devez avoir à ouvrir d'être /dev/thermoX.
Regarder
/dev/bus/usb
: les répertoires sont des plaques tournantes et les fichiers en eux — périphériques.Merci. J'ai essayé, mais il y a un autre problème: Les noms de fichier sont l'id de l'appareil. L'id de l'appareil est toujours augmenté lorsqu'un appareil est raccordé. Malheureusement, le périphérique usb se reconnecte tout le temps sans rien faire. Je ne sais pas quel est le nom du répertoire est exactement, parce que si je connecter un hub usb puis je viens d'obtenir un nouveau fichier dans un sous-répertoire et non un nouveau répertoire.
Il est vraiment difficile de les identifier absolument dispositifs identiques.
Malheureusement oui:-( je thoght il est facile de le faire avec le matériel de chemin d'accès qui est imprimé en
dmesg
, mais je ne peux pas trouver un moyen d'obtenir ce chemin pour unstruct usb_device
.OriginalL'auteur Eddy_Em