如何创建一个程序来列出Mac中的所有USB设备?

21

我对Mac OS X操作系统有限的接触,现在开始使用Xcode并正在学习I/O kit。我需要在Xcode下创建一个命令行工具程序,以便在Mac系统中列出所有连接的USB设备。如果有此方面的经验,请帮助我。如果有人能提供样本代码,那将非常有用,因为我正在寻找起点。

3个回答

22
您可以根据自己的需要调整 USBPrivateDataSample,该示例程序设置了一个通知器,列出了当前连接的设备,并等待设备的连接/断开。如果您这样做,将要移除 usbVendorusbProduct 匹配字典,这样所有的 USB 设备都会被匹配。
或者,您可以使用 IOServiceGetMatchingServices 通过由 IOServiceMatching(kIOUSBDeviceClassName) 创建的字典获取所有当前匹配服务的迭代器。
下面是一个简短的示例(我从未运行过):
#include <IOKit/IOKitLib.h>
#include <IOKit/usb/IOUSBLib.h>

int main(int argc, const char *argv[])
{
    CFMutableDictionaryRef matchingDict;
    io_iterator_t iter;
    kern_return_t kr;
    io_service_t device;

    /* set up a matching dictionary for the class */
    matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
    if (matchingDict == NULL)
    {
        return -1; // fail
    }

    /* Now we have a dictionary, get an iterator.*/
    kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
    if (kr != KERN_SUCCESS)
    {
        return -1;
    }

    /* iterate */
    while ((device = IOIteratorNext(iter)))
    {
        /* do something with device, eg. check properties */
        /* ... */
        /* And free the reference taken before continuing to the next item */
        IOObjectRelease(device);
    }

   /* Done, release the iterator */
   IOObjectRelease(iter);
   return 0;
}

谢谢你的帮助。这非常有用,与我所寻找的相似。但是当我构建它时,这段代码显示错误,例如error: IOServiceGetmatchingServices在main.o中被_main引用... _IOObjectRelease,_IOServiceMatching,_IOIteratorNext,_kIOMasterPortDefault也有类似的错误。我在xcode下创建了一个项目->命令行工具->标准c++。如果您能提供帮助,我将非常感激。 - Dileep
构建时出现的错误.................未定义符号: "_kIOMasterPortDefault",在main.o中的_kIOMasterPortDefault$non_lazy_ptr被引用 "_IOServiceGetMatchingServices",在main.o中的_main被引用 "_IOObjectRelease",在main.o中的_main和main.o中的_main被引用 "_IOServiceMatching",在main.o中的_main被引用 "_IOIteratorNext",在main.o中的_main被引用 ld: 找不到符号 collect2: ld返回1个退出状态 - Dileep
4
你需要在项目中使用I/O Kit框架(即IOKit.framework)和Core Foundation框架,否则它将无法链接。 - Hasturkun
谢谢。现在构建成功,程序也能运行。如我之前所述,我只需要列出USB设备。请帮我提供一个仅列出USB设备的命令。我一直在寻找像这样的示例代码,这对我非常有帮助。 - Dileep
3
/显示设备名称/ io_name_t deviceName; kr = IORegistryEntryGetName(device, deviceName); if (KERN_SUCCESS != kr) { deviceName[0] = '\0'; } printf("\n设备名称:%s",deviceName);.........................这样可以给我设备名称...现在我正在寻找能够动态显示设备连接和断开的程序..请帮忙。 - Dileep
1
@DILi:看看我链接的USBPrivateDataSample,它使用了附加/分离通知。 - Hasturkun

7
你只需要访问IOKit注册表。您可以使用ioreg工具来完成此操作(例如通过system()或popen()运行它)。如果不能,则至少可以使用它来验证您的代码:
有关ioreg工具的信息:
$ man ioreg

获取USB设备列表:

$ ioreg -Src IOUSBDevice

谢谢您的帮助。这对于验证非常有帮助。但是我需要一个在Xcode(使用C++)中列出USB设备的程序。 - Dileep
2
你有没有读到使用 system()popen() 在代码中执行 ioreg 工具的部分? - Paul R
我看过了。但我正在寻找像hausturkun所提供的代码一样的东西。这也很有用。但如果你能给出像我说的那样的一些示例代码,那就是最好的了。 - Dileep

3
如果您运行system_profiler SPUSBDataType,它将列出连接到系统的所有USB设备,然后您可以将数据转储到文本文件中或从命令中读取并在应用程序中处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接