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