2014-02-26 3 views
6

Ich bin ein Neuling in Mac OSX Welt und ich muss ein Skript schreiben, die mir die Hersteller-ID und Produkt-ID eines angeschlossenen USB-Gerät gibt. Ich habe es für Windows und Linux gemacht, aber für Mac habe ich keine Ahnung, wo ich anfangen soll.Mac OSX USB-Hersteller-ID und Produkt-ID

Ich habe diese post gesehen, aber die Verbindung mit dem Beispiel funktioniert nicht. Weißt du irgendeinen Rat, wo ich anfangen kann oder wo ich ein paar Beispiele finde?

Insbesondere welche Sprache soll ich verwenden?

+0

Welche Sprache haben Sie für Linux usw. benutzt? Ich hätte gedacht, dass C ein guter Ausgangspunkt wäre. Basierend auf Linux/OSX Unix-Wurzeln – BillyBigPotatoes

+0

Ich habe C für Linux und C++ für Windows verwendet, aber ich kann auch jede andere Sprache verwenden. – Sceik

Antwort

14

Sie haben Ihre Frage mit bash getaggt, also beantworte ich sie so, als würde ich fragen, wie man das in bash macht, anstatt zu fragen, welche Sprache verwendet werden soll (was die Frage off-topic für StackOverflow wäre).

Sie können vorhandene Daten aus system_profiler mit integrierten Tools analysieren. Zum Beispiel, hier ist ein Abwerfen des Anbieter: Produktpaar, mit „Location ID“ und Herstellern ...

#!/bin/bash 

shopt -s extglob 

while IFS=: read key value; do 
    key="${key##+()}" 
    value="${value##+()}" 
    case "$key" in 
    "Product ID") 
     p="${value% *}" 
     ;; 
    "Vendor ID") 
     v="${value%% *}" 
     ;; 
    "Manufacturer") 
     m="${value}" 
     ;; 
    "Location ID") 
     l="${value}" 
     printf "%s:%s %s (%s)\n" "$v" "$p" "$l" "$m" 
     ;; 
    esac 
done < <(system_profiler SPUSBDataType) 

Dies beruht auf der Tatsache, dass Location ID das letzte Element für jedes USB-Gerät, das ich haven‘aufgeführt ist t endgültig überprüft. (Es scheint nur so für mich.)

Wenn Sie möchten, dass (1) einfacher zu lesen ist und (2) nicht von bash abhängig ist und daher portabler ist (kein Problem, alle Macs kommen mit bash), sollten Sie überlegen anstelle von reinem bash in awk Ihr schweres Heben zu tun:

#!/bin/sh 

system_profiler SPUSBDataType \ 
    | awk ' 
     /Product ID:/{p=$3} 
     /Vendor ID:/{v=$3} 
     /Manufacturer:/{sub(/.*: /,""); m=$0} 
     /Location ID:/{sub(/.*: /,""); printf("%s:%s %s (%s)\n", v, p, $0, m);} 
    ' 

oder vermeiden, auch diese in der Schale Verpackung vollständig mit:

#!/usr/bin/awk -f 

BEGIN { 

    while ("system_profiler SPUSBDataType" | getline) { 
    if (/Product ID:/) {p=$3} 
    if (/Vendor ID:/) {v=$3} 
    if (/Manufacturer:/) {sub(/.*: /,""); m=$0} 
    if (/Location ID:/) {sub(/.*: /,""); printf("%s:%s %s (%s)\n", v, p, $0, m)} 
    } 

} 

Beachten Sie, dass Sie auch die Ausgabe von system_profiler im XML-Format bekommen:

$ system_profiler -xml SPUSBDataType 

Sie benötigen jedoch einen XML-Parser, um diese Ausgabe zu verarbeiten. Und Sie werden feststellen, dass es eine Menge Arbeit ist, XML in nativer Bash zu parsen.

2

Je nachdem, was Sie mit den Informationen tun möchten, können Sie einfach in System Information nachschlagen.

Klicken Sie auf das Apple Menü oben links im Bildschirm, About this Mac, More Info, System Report und Hardware oben links wählen, dann USB.

Sie könnten vielleicht Applescript schreiben, um das zu tun, aber wenn Sie weitermachen und mit dem Gerät in irgendeiner Weise interagieren, ist dies möglicherweise nicht der beste Ansatz.

+0

Ich brauche ein Skript, das mir bei einem USB-Pfad die Hersteller-ID und die Produkt-ID des Geräts zurückgibt. Ich brauche diese Informationen eigenständig (ich muss nicht mit dem Gerät interagieren). – Sceik

3

Sie können die system_profiler Befehl wie folgt verwenden:

system_profiler -detailLevel full 

und die outout aus, dass analysieren. Oder Sie können die Option -xml zum Befehl system_profiler hinzufügen und XML einfach mit awk/grep oder dem XML-Modul in Perl parsen.

Beispiel Extrakt:

| | | | +-o FaceTime HD Camera (Built-in)@0 <class IOUSBInterface, id 0x1000002b2, registered, matched, active, busy 0 (26 ms), retain 7> 

| | | | | { 
| | | | |  "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"} 
| | | | |  "bcdDevice" = 0x755 
| | | | |  "IOUserClientClass" = "IOUSBInterfaceUserClientV3" 
| | | | |  "idProduct" = 0x850b 
| | | | |  "bConfigurationValue" = 0x1 
| | | | |  "bInterfaceSubClass" = 0x1 
| | | | |  "locationID" = 0xfffffffffa200000 
| | | | |  "USB Interface Name" = "FaceTime HD Camera (Built-in)" 
| | | | |  "idVendor" = 0x5ac 

In Bezug auf den Pfad zum USB-Gerät, ich habe keine Ahnung, wie man das einfach auf einem Mac tun würde. Ich könnte versucht sein zu laufen:

find /dev -type b -o -type c 

vor dem Einlegen des USB-Geräts und Speichern der Ausgabe. Lassen Sie dann Ihren Benutzer das Gerät einlegen und führen Sie den gleichen Befehl erneut aus, um zu sehen, welche speziellen Gerätedateien als Ergebnis des Einstöpselns Ihres Geräts hinzugefügt wurden. Vielleicht grob, vielleicht effektiv - nur eine Idee.