Lukas: USB Host / Hub ID herausfinden

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:

  • Auf dem USB Stick befindet sich ein Script, das per Autostart ein Signal an den Kopiercontroller schickt, dass es Daten haben will; zum Beispiel zusammen mit dem Laufwerksbuchstaben.
  • Der Controller überprüft anhand der Device ID des Hosts (oder Hubs?), an welchem USB Hub der Stick klemmt
  • Abhängig von der DeviceID des Hubs wird ein bestimmter Ordner auf das übergebene Laufwerk, den anfordernden Stick, geschickt.

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

  1. 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

  2. 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

  3. 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:

    floppy devices

    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

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".