IOServiceGetMatchingServices не находит некоторые устройства на некоторых компьютерах Mac - PullRequest
1 голос
/ 27 мая 2011

У меня проблема с приложением, которое отслеживает изменения на шине USB.В частности, если я хочу получить список подключенных USB-сервисов, я использую код ниже.Странно то, что некоторые пользователи (и, конечно, не мои машины) не видят одно или два устройства.Эти устройства отображаются в IORegistryExplorer и показывают зарегистрированных.

Машины, для которых это не работает, также работают под управлением 10.6 и также являются MacBook Pro.(NULL, 0, NULL, NULL);CFMutableDictionaryRef child_props = CFDictionaryCreateMutable (NULL, 0, NULL, NULL);

kr = IOServiceGetMatchingServices(kIOMasterPortDefault,
                                  IOServiceNameMatching("AppleUSBEHCI"), &io_objects);

if(kr != KERN_SUCCESS)
    exit(1);

while((io_service= IOIteratorNext(io_objects)))
{

    kr = IORegistryEntryCreateCFProperties(io_service, &service_properties, kCFAllocatorDefault, kNilOptions);

    io_iterator_t   iter;
    kr = IORegistryEntryGetChildIterator(io_service, kIOServicePlane, &iter);
    io_registry_entry_t     child;
    while( (child = IOIteratorNext( iter )))
    {
        kr = IORegistryEntryCreateCFProperties(child, &child_props,  kCFAllocatorDefault, kNilOptions );
        NSLog(@"%@",child_props);
    }

    IOObjectRelease(io_service);
}

Ответы [ 3 ]

2 голосов
/ 22 июля 2014

Вы согласны на совершенно не то, что нужно. Вы сравниваете данные с физическим контроллером, используемым в Mac (EHCI, UHCI, OHCI). Это не удастся всякий раз, когда они изобретают новый стандарт контроллера, такой как XHCI в новых Mac с 2012 года (для совместимости с USB 3).

То, что вы, вероятно, хотите сделать, это сопоставить с IOUSBDevice, то, что я делаю, когда хочу сопоставить каждое устройство в системе. Это также делается в примере кода Deva.

0 голосов
/ 09 августа 2013

Я согласен с Джереми: есть и другие возможности, кроме AppleUSBEHCI

Может быть, вы знаете, что (на всякий случай):

ioreg -l | grep AppleUSB

должно отображать состояние USB на вашем компьютере

0 голосов
/ 28 ноября 2011

Оказывается, нужно опросить все типы шин:

for(i=0;i<3;i++){

if(i==0)kr = IOServiceGetMatchingServices(myMasterPort,
                                      IOServiceNameMatching("AppleUSBEHCI"), &io_objects);
if(i==1)kr = IOServiceGetMatchingServices(myMasterPort,
                                      IOServiceNameMatching("AppleUSBOHCI"), &io_objects);
if(i==2)kr = IOServiceGetMatchingServices(myMasterPort,
                                      IOServiceNameMatching("AppleUSBUHCI"), &io_objects);

if(kr != KERN_SUCCESS)
    exit(1);
...