Как создать программу для вывода списка всех USB-устройств на Mac? - PullRequest
18 голосов
/ 27 сентября 2011

У меня ограниченное знакомство с операционной системой Mac OS X, и теперь я начал использовать XCode и изучаю набор I / O. Мне нужно создать программу в XCode под инструментом командной строки, чтобы перечислить все USB-устройства, подключенные в системе Mac. Те, кто имеет предыдущий опыт в этом, пожалуйста, помогите мне. Если кто-нибудь сможет предоставить мне пример кода, он будет очень полезен, поскольку я ищу отправную точку.

Ответы [ 3 ]

19 голосов
/ 27 сентября 2011

Вы можете адаптировать USBPrivateDataSample к вашим потребностям, образец настраивает уведомитель, перечисляет подключенные в данный момент устройства, затем ожидает подключения / отсоединения устройства.Если вы это сделаете, вы захотите удалить соответствующие словари usbVendor и usbProduct, чтобы все устройства 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;
}
7 голосов
/ 27 сентября 2011

Вам просто нужно получить доступ к IOKit Registry .Вы вполне можете использовать для этого инструмент ioreg (например, запустите его через system() или popen()).Если нет, то вы можете хотя бы использовать его для проверки своего кода:

Информация о ioreg инструменте:

$ man ioreg

Получить список USB-устройств:

$ ioreg -Src IOUSBDevice
2 голосов
/ 27 сентября 2011

Если вы запустите system_profiler SPUSBDataType, в нем будут перечислены все USB-устройства, подключенные к системе, вы можете затем взаимодействовать с этими данными, либо выгрузив их в текстовый файл, либо прочитав их из команды в приложение и поработав с ней. есть.

...