2011-04-10 72 views
3

我目前正在開發一個應用程序在10.6.7,它應該接收通知,當一個新的USB設備插入。我發現有一個IOKit函數處理這樣的'IOServiceAddMatchingNotification'的東西。因爲這個特定函數的返回值是0,所以我認爲這個問題可能出現在我的匹配字典中,這個函數被賦予了這個函數。我宣佈詞典那樣:從IOKit(CoreFoundation)接收通知插入設備的問題

CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName); 

因爲我wan't接收爲每個設備的通知,我不知道這是創建這個特定字典的正確途徑。

我完整的代碼如下所示:

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

+0

我還沒有非常熟悉IOKit的用戶空間,但在內核方面,匹配首先發生在最特定的匹配字典上,並且只有在失敗時纔會嘗試更一般的匹配。你是否嘗試過使用已經與現有驅動程序匹配的設備?此外,也許這將有所幫助:http://developer.apple.com/library/mac/#qa/qa1076/_index.html – pmdj 2011-04-13 08:55:16

+0

我試過這個與我現在使用一段時間的USB棒。 Finder發現這個棒,所以我認爲我不需要在OS X的驅動程序目錄中寫入一個條目。另外我喜歡獲取從未連接到我的mac的棒的通知,所以應該有一種方法來處理這...我仍然無法找到這種方式... – Andi 2011-04-13 21:14:01

回答

0

做什麼,我想您所描述的最簡單方法是掛接到DiskArbitration框架。 DA對於OSX來說是相對較新的,並允許用戶級應用程序在設備連接時對其進行檢查。它是什麼用於連接iPod時打開iTunes,連接相機時啓動iPhoto等等......如果您正在查找的USB設備是存儲設備,那麼這將適用於您。否則,你將需要去匹配字典路線...

1

在我看來,ü應該下載源代碼的形式IOUSBFamily上opensource.apple.com,然後找到代碼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成功後,你需要調用與是迭代您添加的設備處理程序在通話中設置。這將武裝通知並檢查現有設備。