2016-08-30 1 views
2

Gibt es einen Weg, IOKit oder etwas ähnliches zu verwenden, das das Herunterladen zusätzlicher Pakete aus dem Internet nicht einschließt, das ich verwenden kann, um den Produktnamen eines USB-Geräts zu lesen?Produktname des USB-Geräts aus portIterator

Dies ist mein aktueller Code ...

func printSerialPaths(portIterator: io_iterator_t) { 
    var serialService: io_object_t 
    repeat { 
     serialService = IOIteratorNext(portIterator) 
     if (serialService != 0) { 
      var key: CFString! = "IOCalloutDevice" 
      var bsdPathAsCFtring: AnyObject? = IORegistryEntryCreateCFProperty(serialService, key, kCFAllocatorDefault, 0).takeUnretainedValue() 
      var bsdPath = bsdPathAsCFtring as! String? 
      if let path = bsdPath { 
       print(path) 
      } 

      var deviceNameCString: [CChar] = [CChar](count: 128, repeatedValue: 0) 
      let deviceNameResult = IORegistryEntryGetName(serialService, &deviceNameCString) 
      let deviceName = String.fromCString(&deviceNameCString)! 
      print("usb Device Name: \(deviceName)") 


     } 
    } while serialService != 0; 
} 

Ich habe versucht, auch andere CFStrings, wie „Produktnamen“ im IORegistryEntryCreateCFProperty() Befehl wie ich habe an anderer Stelle ohne Glück vorgeschlagen gesehen. Wenn das Ersetzen alles ist, was ich brauche, wo finde ich die Dokumentation für den Rest dieser Strings?

Der Produktname, über den ich spreche, ist unten hervorgehoben. Ich bin mir nicht sicher, wie sein technischer Name lauten würde.

enter image description here

Antwort

1

Wenn der io_service_t Handle zu einem IOUSBDevice/IOUSBHostDevice ist, sollte es eine Eigenschaft "USB Product Name" (symbolische Konstante kUSBProductString, zumindest in C) genannt haben - ich glaube, das ist, was Sie nach. Sie können es mit IORegistryEntryCreateCFProperty() abfragen, wie Sie bereits für die Eigenschaft "IOCalloutDevice" tun, die übrigens als die symbolische Konstante kIOCalloutDeviceKey definiert ist.

Wenn diese Konstanten beim Importieren des IOKit-Moduls nicht in Swift existieren, definieren Sie einfach Ihre eigenen Konstanten und melden Sie einen Fehler (Radar) mit Apple über die Auslassung.

+0

Das beinhaltet eine Menge guter Orte, um dies zu erforschen, aber leider habe ich nichts gefunden. "KUSBProductString" gibt es in Swift nicht. Auf der Suche nach anderen habe ich Sachen wie 'kUSBVendorName' gefunden, aber sie scheinen nur in anderen Sprachen wie Objective-C zu funktionieren und verursachen mir fatale Fehler. – crait

+1

In diesem Fall sollte es ziemlich sicher sein, eigene Versionen dieser Konstanten in Swift zu definieren und diese einfach zu verwenden. Sie werden sich nicht ändern, außer dass OS X 10.11 neue eingeführt und die Eigenschaftswerte für die alten und neuen Schlüssel festgelegt hat. (Dies hat mit dem neuen USB-Stack zu tun, obwohl der Grund, warum Apple neue Property-Namen erstellt hat, nicht klar ist.) – pmdj

+3

Die Verwendung eines Bridging-Headers hilft mir, die meisten Konstanten zu bekommen - sie sind nicht immer zugänglich, wenn ich nur IOKit in Swift importiere. http://stackoverflow.com/a/39026607/2227743 – Moritz

Verwandte Themen