Hi, Mal wieder eine Frage an die libusb leute ;-) Folgender Ablauf: 1. es sind viele meiner Geräte an einem PC angeschlossen, auf manchen läuft grad eine Applikationssoftware, auf manchen der Bootloader 2. ich wähle ein bestimmtes Gerät aus, auf dem eine Applikation läuft, vom PC aus (Host software + libusbJava) wird der Befehl den Bootloader zu starten gesendet 3. das Gerät resetet sich und meldet sich als Bootloader (andere PID, gleiche VID) wieder am Host an. 4. die hostsotware soll genau dieses Gerät wiederfinden aus allen angeschlossenen Geräten. Wie machen ich diesen letzten Punkt? es gibt die funktion usbdevice.getBus() welche mir die nummer des Hostcontroller zurückliefert an dem das Gerät hängt. Damit kann ich schonmal eine Teilunterscheidung machen, bleiben allerdings noch theoretisch maximal 127 unterschiedliche Geräte die an diesem controller hängen könnten. usbdevice.getFilename scheint mir eine nummer zurückzuliefern welche beim suchen der geräte einfach aufitteriert wird. Diese nummer ist allerdings nur "konstant" solange keine geräte angeklemmt oder abgesteckt werden. den usbhandle einfach weiterverwenden kann ich nicht, da dieser zerstört wird wenn sich das device mit anderem descriptor neu anmeldet, was der fall ist da Applikation und Bootloader unterschiedliche PIDs verwenden. Gibt es noch andere Möglichkeiten? ich würde es vorziehen nicht jedes device öffnen zu müssen und zu fragen ob es das richtige ist. Grüße Chris
Wenn Du wirklich das selbe Gerät wiederfinden möchtest, mußt Du von allen Geräten die SerialNumber im Descriptor lesen und vergleichen. Das setzt aber voraus, daß Du auch im Bootloader Modus diese Seriennummer gesetzt hast. Die Seriennummer ist unabhängig von VID und PID.
Oder alternativ (falls vom Gerät keine Seriennummer unterstützt wird) die PortID merken, also an welchem Controller und dessen Kanal das Gerät angeschlossen ist und nach dem Bootloaderstart wieder drauf zugreifen. Zusätzlich vielleicht noch sicherheitshalber VID/PID vergleichen. Ralf
Hi, danke für die schnellen Antworten, ich hab dazu allerdings jeweils noch eine Frage. Die PortID war auch einer meiner ersten Gedankengänge, habe aber keine Möglichkeit gefunden diese auszulesen, werde aber aufjedenfall nochmal danach schaun. Die Serialnumber hatte ich erst ausser acht gelassen weil ich dachte sie wäre nur 1byte groß, dabei ist das ja nur der index für den string descriptor. jetzt die große preisfrage, wie les ich den denn aus? Die Variante würde mir am besten gefallen, da sie am wenigsten fehleranfällig wäre, vorrausgesetzt ich bekomm es hin das die Seriennummern einzigartig sind, aber das sollte ja machbar sein.
Tastkopf schrieb: > Hi, > danke für die schnellen Antworten, ich hab dazu allerdings jeweils noch > eine Frage. > Die PortID war auch einer meiner ersten Gedankengänge, habe aber keine > Möglichkeit gefunden diese auszulesen, werde aber aufjedenfall nochmal > danach schaun. > Die Serialnumber hatte ich erst ausser acht gelassen weil ich dachte sie > wäre nur 1byte groß, dabei ist das ja nur der index für den string > descriptor. jetzt die große preisfrage, wie les ich den denn aus? Die > Variante würde mir am besten gefallen, da sie am wenigsten > fehleranfällig wäre, vorrausgesetzt ich bekomm es hin das die > Seriennummern einzigartig sind, aber das sollte ja machbar sein. Die Serialnummer kannst du direkt aus dem Device Path auslesen, oder aber mit LibUSB:
1 | if (dev->descriptor.iSerialNumber) { |
2 | ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string)); |
3 | if (ret > 0) |
4 | printf("- Serial Number: %s\n", string); |
5 | else
|
6 | printf("- Unable to fetch serial number string\n"); |
7 | }
|
ok, Seriennummer kann ich auslesen, mich stört allerdings dass ich dafür das Device öffnen muss, da die Stringdescriptoren wohl beim Anmeldem am Host nicht abgefragt werden. für die PortID find ich allerdings keine Möglichkeit diese auszulesen. Bin alle Funktionen durchgegangen die ich für möglich erachtet habe und google will mir auch nicht weiterhelfen.
Dann musst du am besten über die Windows SetupAPI gehen, da geht das auf jeden Fall ohne Öffnen. Oder über die Registry. Denn die Seriennummer wird z.B. auch (ohne Gerät öffnen) im Gerätemanager angezeigt.
ja und wie unterscheid ich sie wenn ich die geräte über die libusb ansprechen will? Wenn ich über die Windows SetupAPI rausgefunden habe an welchen hubs und ports meine geräte hängen, kann ich sie ja nicht auf libusb ebene unterscheiden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.