Получить название продукта USB-устройства от portIterator

Есть ли способ, используя IOKit или что-то подобное, не требующий загрузки дополнительных пакетов из Интернета, который я могу использовать для чтения названия продукта USB-устройства?

Это мой текущий код...

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;
}

Я также пытался использовать другие CFStrings, такие как "Product Name" в команде IORegistryEntryCreateCFProperty(), как я видел в других местах, но безуспешно. Если заменить это все, что мне нужно, где я могу найти документацию для остальных строк?

Название продукта, о котором я говорю, выделено ниже. Я не уверен, каким будет его техническое название.

введите здесь описание изображения


person crait    schedule 30.08.2016    source источник


Ответы (1)


Если дескриптор io_service_t относится к IOUSBDevice/IOUSBHostDevice, он должен иметь свойство с именем "USB Product Name" (символическая константа kUSBProductString, по крайней мере, в C) - я думаю, это то, что вам нужно. Вы можете запросить его с помощью IORegistryEntryCreateCFProperty(), как вы уже делаете для свойства "IOCalloutDevice", которое, кстати, определено как символическая константа kIOCalloutDeviceKey.

Если эти константы не существуют в Swift при импорте модуля IOKit, просто определите свои собственные константы и сообщите об ошибке (Radar) в Apple об упущении.

person pmdj    schedule 30.08.2016
comment
Это включает в себя кучу хороших мест для начала исследования, но, к сожалению, я ничего не придумал. kUSBProductString не существует в Swift. В поисках других я нашел такие вещи, как kUSBVendorName, но они, похоже, работают только на других языках, таких как Objective-C, и вызывают у меня фатальные ошибки. - person crait; 31.08.2016
comment
В этом случае должно быть довольно безопасно определить свои собственные версии этих констант в Swift и просто использовать их. Они не изменятся, за исключением того, что OSX 10.11 представила новые и устанавливает значения свойств как для старого, так и для нового ключа. (Это связано с новым стеком USB, хотя причина, по которой Apple создала новые имена свойств, не ясна.) - person pmdj; 31.08.2016
comment
Использование связующего заголовка помогает мне получить большинство констант — они не всегда доступны, если я просто импортирую IOKit в Swift. stackoverflow.com/a/39026607/2227743 - person Eric Aya; 31.08.2016