Проблемы с получением уведомлений от IOKit (CoreFoundation) для подключенных устройств - PullRequest
3 голосов
/ 10 апреля 2011

В настоящее время я разрабатываю приложение на 10.6.7, которое должно получать уведомления при подключении нового USB-устройства. Я обнаружил, что есть функция IOKit, которая обрабатывает такие вещи, как IOServiceAddMatchingNotification. Поскольку возвращаемое значение из этой конкретной функции равно 0, я думаю, что проблема, возможно, в моем соответствующем словаре, который передается в эту функцию. Я провозглашаю Словарь таким образом:

CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName);

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

Мой полный код выглядит так:

ioKitNotificationPort = IONotificationPortCreate(kIOMasterPortDefault);
notificationRunLoopSource = IONotificationPortGetRunLoopSource(ioKitNotificationPort);

CFRunLoopAddSource(CFRunLoopGetCurrent(), notificationRunLoopSource, kCFRunLoopDefaultMode);

CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName);


addMatchingNotificationResult = IOServiceAddMatchingNotification(ioKitNotificationPort,
                                                                 kIOPublishNotification,
                                                                 matchingDict,
                                                                 deviceAdded,
                                                                 NULL,

У кого-нибудь есть идеи, почему это не сработает? (Примечание: функция обратного вызова является статической функцией void c, а остальные я класс Obj-C).

Спасибо

Xcode 4, 10.6.7

Ответы [ 4 ]

3 голосов
/ 09 августа 2011

Как ни странно, вы должны очистить итератор, возвращенный IOServiceAddMatchingNotification, прежде чем уведомление будет поставлено на охрану. Я не вижу этого в предоставленном коде, так что это может быть проблемой. Этот итератор - это то, что вам нужно держать, чтобы уведомление работало.

io_iterator_t ioNotification;

addMatchingNotificationResult = IOServiceAddMatchingNotification(ioKitNotificationPort,
                                                                 kIOPublishNotification,
                                                                 matchingDict,
                                                                 deviceAdded,
                                                                 NULL,
                                                                 &ioNotification);

while ((service = IOIteratorNext(ioNotification)))
{
    NSLog(@"Hey, I found a service!");

    IOObjectRelease(service); // yes, you have to release this
}
1 голос
/ 18 июля 2012

Вы добавили VID и PID устройства, которое хотите найти, в свой соответствующий словарь? Для вашего словаря, и VID = yourVid, PID = yourPid, это будет:

CFDictionaryAddValue(matchingDict, usbVendorId, yourVid);  
CFDictionaryAddValue(matchingDict, usbProductId, yourPid);  

Другое дело - после успешного вызова IOServiceAddMatchingNotification вам необходимо вызвать обработчик с добавленным устройством с итератором, который был установлен в вызове. Это активирует уведомление и проверит наличие существующих устройств.

1 голос
/ 13 июля 2011

По моему мнению, вы должны скачать форму исходного кода IOUSBFamily на opensource.apple.com, а затем найти код для USB Prober , это приложение делает то же самое, что вы описали, слушая Подключение устройства USB. (Далее, USB Prober также получите общий дескриптор устройства и конфигурации, возможно, это также то, что вам нужно.)

0 голосов
/ 07 июля 2011

Самый простой способ сделать то, что, я думаю, вы описываете, это подключиться к DiskArbitration Framework.DA является относительно новым для OSX и позволяет пользовательским приложениям проверять устройства по мере их подключения.это то, что используется для открытия iTunes при подключении iPod, запуска iPhoto при подключении камеры и т. д. ... если искомое USB-устройство является запоминающим устройством, это будет работать для вас.в противном случае вам нужно будет пройти соответствующий словарный маршрут ...

...