USB Host / Hub ID herausfinden
Lukas
- perl
0 Wolfgang0 hotti0 Alexander (HH)
Hi,
dieses hat nichts mit Webentwicklung zu tun, dennoch frage ich hier, weil dieses Forum ein Treffpunkt für viele kompetente Entwickler ist. Vielleicht weiß es ja jemand.
Eine automatische Kopiervorrichtung, die ich gerade bastle, soll je nach USB-Hub, in das ein USB-Stick gesteckt wurde, einen unterschiedlichen Ordner auf den Stick spielen. Dazu habe ich mir folgendes Prinzip erdacht:
Soweit so gut, den Laufwerksbuchstaben hab ich, die Kopierfunktion im Prinzip auch. Nur wie in aller Welt finde ich in PERL das USB-Hub, an dem der Stick hängt, heraus?
Im Moment ist das ganze für Windows XP gedacht, ich bin jedoch gerne bereit, spontan auf Linux umzubauen.
Das System ist mir noch nicht bekannt, wird aber 7 USB Buchsen haben, an die dann je ein Hub gesteckt werden (also 7 unterschiedliche Hubs = 7 unterschiedliche Ordner).
Bitte verzeiht mögliche Begriffsungenauigkeiten bzgl. Hub und Host. Wer zeit hat, darf mich gerne korrigieren ;-)
Liebe Grüße
Lukas
Hallo
Eine automatische Kopiervorrichtung, die ich gerade bastle, soll je nach USB-Hub, in das ein USB-Stick gesteckt wurde, einen unterschiedlichen Ordner auf den Stick spielen. Dazu habe ich mir folgendes Prinzip erdacht:
Im Grunde könntest du auch fragen: Ich habe eine Festplatte oder einen CD-Brenner an unterschiedlichen SATA-Anschlüssen oder auch unterschiedlichen IDE-Verbindungen angeschlossen und möchte nun auf diese Situation unterschiedlich reagieren.
Sorry aber die Aufgabe eines richtigen Betriebssystems besteht genau darin, diese Dinge instransparent zu machen, vor allem auf der Ebene von Perl. Du müsstest auf Treiberebene Routinen schreiben können und wenn du hier fragst, dann vergiss es lieber.
Herzliche Grüße
Wolfgang
hi,
den Hub kannst Du nicht herausfinden. Der ist transparent. Aber schaue Dir trotzdem mal das Perl-Modul
Win32::DriveInfo
an. USB-Drives könnten damit anhand des Labels (Laufwerkname) ermittelt werden. Alternative: Die ext. LW haben einen Token im Stammverzeichnis, z.B. in Form einer Datei mit einem bestimmten Namen.
Viele Grüße,
Horst Haselhuhn
Moin Moin!
Eine automatische Kopiervorrichtung, die ich gerade bastle, soll je nach USB-Hub, in das ein USB-Stick gesteckt wurde, einen unterschiedlichen Ordner auf den Stick spielen.
Im Moment ist das ganze für Windows XP gedacht, ich bin jedoch gerne bereit, spontan auf Linux umzubauen.
Ich möchte nicht behaupten, dass es unmöglich ist, unter Windows an entsprechende Informationen zu kommen. Aber ich denke, unter Linix ist es wesentlich einfacher.
Das System ist mir noch nicht bekannt, wird aber 7 USB Buchsen haben, an die dann je ein Hub gesteckt werden (also 7 unterschiedliche Hubs = 7 unterschiedliche Ordner).
lsusb -t
Bus# 5
-Dev# 1 Vendor 0x1d6b Product 0x0001 Bus# 4
-Dev# 1 Vendor 0x1d6b Product 0x0001
Bus# 3
-Dev# 1 Vendor 0x1d6b Product 0x0001
-Dev# 71 Vendor 0x04f3 Product 0x0103
Bus# 2
-Dev# 1 Vendor 0x1d6b Product 0x0001 Bus# 1
-Dev# 1 Vendor 0x1d6b Product 0x0002
`-Dev# 3 Vendor 0x059b Product 0x0277
Damit sind die Geräte schomal gefunden und in einen Baum einsortiert. (Hier: Noname-Tastatur und externe Platte) Hilft noch nicht komplett weiter, aber ein erster Schritt ist getan.
udevd legt beim Einstecken von USB-Devices (und bei vielen anderen Gelegenheiten) die entsprechenden Device-Nodes an, kann aber auch gleich noch ein Programm starten. Einfach eine entsprechende Regel anlegen. Das sieht dann ungefähr so aus:
KERNEL=="fd[0-9]*", NAME="floppy/%n", SYMLINK+="%k", GROUP="floppy", PROGRAM="/lib/udev/floppy-extra-devs.sh %k %b %n"
Mehr Infos in udev(7).
Der hald, zusammen mit dem dbus-daemon, posaunt Informationen über frisch eingesteckte Hardware auch gerne an interessierte Programme, Zugriffsrechte vorausgesetzt. Zu sehen z.B. bei KDE, das (immer wieder Zugriffsrechte vorausgesetzt) USB-Sticks, CDs und ähnliches bei Bedarf mounted und gleich ein konfiguriertes Programm startet. Das dürfte hier aber Overkill sein.
Linux 2.6.xx und ein passendes Script, in udev eingebunden, sollten Dein Problem eigentlich lösen können.
Alexander