2011-04-10 2 views
3

현재 새 USB 장치가 연결될 때 알림을 받아야하는 10.6.7의 응용 프로그램을 개발 중입니다. 이러한 장치를 처리하는 IOKit 기능이 있음을 알게되었습니다 물건 'IOServiceAddMatchingNotification'. 이 특정 함수의 반환 값이 0이기 때문에 아마도이 함수에 주어진 내 일치 사전에 문제가 있다고 생각합니다. 나는 각 장치에 대한 알림을받을 수 wan't이 때문에이 특정 사전을 만들 수있는 올바른 방법 인 경우연결된 장치에 대한 IOKit (CoreFoundation)의 알림 수신 문제

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 클래스 에 래핑됩니다.)

감사

엑스 코드 4, 10.6.7

+0

아직 IOKit의 사용자 공간 측면에 익숙하지는 않지만 커널 측에서는 가장 구체적인 일치하는 사전에 대해 먼저 일치가 발생합니다. 실패한 경우보다 일반적인 일치가 시도됩니다. 이미 기존 드라이버와 일치하는 장치로이 작업을 시도하고 있습니까? 또한 어쩌면이 도움이 될 것입니다 : http://developer.apple.com/library/mac/#qa/qa1076/_index.html – pmdj

+0

나는 지금 몇 시간을 사용하고있는 USB 스틱으로 이것을 시도했습니다. Finder는 스틱을 발견하여 OS X의 드라이버 디렉토리에 항목을 작성할 필요가 없다고 생각합니다. 또한 이전에 결코 사용하지 못했던 스틱에 대한 알림을 받고 싶습니다. 따라서 처리 할 수있는 방법이 있어야합니다 이 ... 아직도 그 길을 찾을 수 없다 ... – Andi

답변

0

난 당신이 묘사하는 생각을 할 수있는 가장 쉬운 방법은 DiskArbitration 프레임 워크에 훅하는 것입니다. DA는 OSX에 비해 비교적 새로운 기능으로 사용자층 어플리케이션이 부착 된 장비를 검사 할 수 있습니다. iPod이 연결되어있을 때 iTunes를 열거 나 카메라가 연결될 때 iPhoto를 실행하는 데 사용되는 것입니다. 찾고있는 USB 장치가 저장 장치 인 경우이 기능이 작동합니다. 그렇지 않으면 당신은 ... 일치하는 사전 경로를 이동해야합니다

제 생각에는
1

, 유 USB 프로 버에 대한 코드를 opensource.apple.com에 소스 코드 형태 IOUSBFamily을 다운로드 한 다음 찾아야한다,이 응용 프로그램은 수행 USB 장치 연결을 청취하는 것과 정확히 똑같은 USB 장치를 수신합니다. (또한 USB Prober도 일반 장치 및 구성 설명자를 얻습니다.)

3

이상하게도 통지가 활성화되기 전에 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

일치하는 사전에 검색 할 장치의 VID 및 PID를 추가 했습니까? 당신이 사전의 경우, 및 VID = yourVid, PID = yourPid, 그것은 다음과 같습니다

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

또 다른 한가지 - IOServiceAddMatchingNotification 성공에 대한 호출 후에이었다 반복자와 장치 추가 핸들러를 호출 할 필요가 통화에서 설정합니다. 그러면 알림이 표시되고 기존 장치를 확인합니다.

관련 문제