3

我目前正在 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,

有谁知道为什么这不起作用?(注意:Callback 函数是一个静态的 void c 函数,其余的都封装在 Obj-C 类中)。

谢谢

Xcode 4、10.6.7

4

4 回答 4

4

奇怪的是,您必须先清空 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
}
于 2011-08-09T00:48:48.210 回答
1

在我看来,你应该在 opensource.apple.com 上下载 IOUSBFamily 的源代码,然后找到USB Prober的代码,这个应用程序和你描述的完全一样,监听 USB 设备附件。(进一步,USB Prober还可以获得通用设备和配置描述符,也许这也是你需要的东西。)

于 2011-07-13T14:48:33.173 回答
1

您是否将要查找的设备的 VID 和 PID 添加到匹配的字典中?对于您拥有的字典,并且 VID= yourVid,PID= yourPid,它将是:

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

另一件事 - 对 IOServiceAddMatchingNotification 的调用成功后,您需要使用在调用中设置的迭代器来调用添加设备的处理程序。这将武装通知并检查现有设备。

于 2012-07-18T16:50:41.187 回答
0

做我认为你所描述的最简单的方法是连接到 DiskArbitration 框架。DA 对于 OSX 来说相对较新,它允许用户级应用程序在连接设备时检查它们。它用于在连接 iPod 时打开 iTunes,在连接相机时启动 iPhoto,等等……如果您正在寻找的 USB 设备是存储设备,那么这将适合您。否则你将需要去匹配的字典路线......

于 2011-07-07T11:59:00.410 回答