从portIterator获取USB设备的产品名称

时间:2016-08-30 18:57:55

标签: swift macos usb iokit

有没有办法,使用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;
}

我也尝试过在IORegistryEntryCreateCFProperty()命令中使用其他CFS字符串,例如"产品名称" ,因为我在其他地方看到过没有运气的建议。如果我只需要替换它,那么我在哪里可以找到其余字符串的文档?

我正在谈论的产品名称将在下面突出显示。我不确定它的技术名称是什么。

enter image description here

1 个答案:

答案 0 :(得分:1)

如果io_service_t句柄属于IOUSBDevice / IOUSBHostDevice,则应该有一个名为"USB Product Name"的属性(符号常量kUSBProductString,至少在C中) - 我相信你所追求的是什么。您可以使用IORegistryEntryCreateCFProperty()查询,因为您已经为" IOCalloutDevice"属性,顺便说一下定义为符号常量kIOCalloutDeviceKey

如果在导入IOKit模块时Swift中不存在这些常量,只需定义自己的常量并向Apple提交有关遗漏的错误(Radar)。