Подтвердить что ты не робот

Как создать программу для отображения всех USB-устройств на Mac?

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

4b9b3361

Ответ 1

Вы можете адаптировать 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;
}

Ответ 2

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

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

$ man ioreg

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

$ ioreg -Src IOUSBDevice

Ответ 3

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