自动检测 USB 设备 Connect/Disconnect
Auto-detect USB Device Connect/Disconnect
我有一个 Cocoa 应用程序,它需要在设备连接到 USB 端口或从 USB 端口断开连接时得到通知。我可以使 DeviceConnected 回调正常工作,但在断开 USB 设备时不会调用 DeviceDisconnected 函数。
下面是我的代码:
+ (void)listenForUSBEvents
{
io_iterator_t portIterator = 0;
CFMutableDictionaryRef matchingDict = IOServiceMatching( kIOUSBDeviceClassName );
IONotificationPortRef notifyPort = IONotificationPortCreate( kIOMasterPortDefault );
CFRunLoopSourceRef runLoopSource = IONotificationPortGetRunLoopSource( notifyPort );
CFRunLoopRef runLoop = CFRunLoopGetCurrent();
CFRunLoopAddSource( runLoop, runLoopSource, kCFRunLoopDefaultMode);
CFRetain( matchingDict );
kern_return_t returnCode = IOServiceAddMatchingNotification( notifyPort, kIOMatchedNotification, matchingDict, DeviceConnected, NULL, &portIterator );
if ( returnCode == 0 )
{
DeviceConnected( nil, portIterator );
}
returnCode = IOServiceAddMatchingNotification( notifyPort, kIOMatchedNotification, matchingDict, DeviceDisconnected, NULL, &portIterator );
if ( returnCode == 0 )
{
DeviceDisconnected( nil, portIterator );
}
}
@end
void DeviceConnected( void *refCon, io_iterator_t iterator )
{
kern_return_t returnCode = KERN_FAILURE;
io_object_t usbDevice;
while ( ( usbDevice = IOIteratorNext( iterator ) ) )
{
io_name_t name;
returnCode = IORegistryEntryGetName( usbDevice, name );
if ( returnCode != KERN_SUCCESS )
{
return;
}
[[NSNotificationCenter defaultCenter] postNotificationName:deviceConnectedNotification object:nil userInfo:nil];
}
}
void DeviceDisconnected( void *refCon, io_iterator_t iterator )
{
[[NSNotificationCenter defaultCenter] postNotificationName:deviceDiconnectedNotification object:nil userInfo:nil];
}
我知道我做错了什么了。
首先,deviceDisconnected 的 IOServiceAddMatchingNotification 应该如下所示:
returnCode = IOServiceAddMatchingNotification( notifyPort, kIOTerminatedNotification, matchingDict, DeviceDisconnected, NULL, &portIterator );
其次,DeviceDisconnected 函数应如下所示:
void DeviceDisconnected( void *refCon, io_iterator_t iterator )
{
kern_return_t returnCode = KERN_FAILURE;
io_object_t usbDevice;
while ( ( usbDevice = ioIteratorNext( iterator ) ) )
{
returnCode = IOObjectRelease( usbDevice );
if ( returnCode != kIOReturnSuccess )
{
NSLog( @"Couldn't release raw device object: %08x.", returnCode );
}
}
[[NSNotificationCenter defaultCenter] postNotificationName:deviceDiconnectedNotification object:nil userInfo:nil];
}
我有一个 Cocoa 应用程序,它需要在设备连接到 USB 端口或从 USB 端口断开连接时得到通知。我可以使 DeviceConnected 回调正常工作,但在断开 USB 设备时不会调用 DeviceDisconnected 函数。
下面是我的代码:
+ (void)listenForUSBEvents
{
io_iterator_t portIterator = 0;
CFMutableDictionaryRef matchingDict = IOServiceMatching( kIOUSBDeviceClassName );
IONotificationPortRef notifyPort = IONotificationPortCreate( kIOMasterPortDefault );
CFRunLoopSourceRef runLoopSource = IONotificationPortGetRunLoopSource( notifyPort );
CFRunLoopRef runLoop = CFRunLoopGetCurrent();
CFRunLoopAddSource( runLoop, runLoopSource, kCFRunLoopDefaultMode);
CFRetain( matchingDict );
kern_return_t returnCode = IOServiceAddMatchingNotification( notifyPort, kIOMatchedNotification, matchingDict, DeviceConnected, NULL, &portIterator );
if ( returnCode == 0 )
{
DeviceConnected( nil, portIterator );
}
returnCode = IOServiceAddMatchingNotification( notifyPort, kIOMatchedNotification, matchingDict, DeviceDisconnected, NULL, &portIterator );
if ( returnCode == 0 )
{
DeviceDisconnected( nil, portIterator );
}
}
@end
void DeviceConnected( void *refCon, io_iterator_t iterator )
{
kern_return_t returnCode = KERN_FAILURE;
io_object_t usbDevice;
while ( ( usbDevice = IOIteratorNext( iterator ) ) )
{
io_name_t name;
returnCode = IORegistryEntryGetName( usbDevice, name );
if ( returnCode != KERN_SUCCESS )
{
return;
}
[[NSNotificationCenter defaultCenter] postNotificationName:deviceConnectedNotification object:nil userInfo:nil];
}
}
void DeviceDisconnected( void *refCon, io_iterator_t iterator )
{
[[NSNotificationCenter defaultCenter] postNotificationName:deviceDiconnectedNotification object:nil userInfo:nil];
}
我知道我做错了什么了。
首先,deviceDisconnected 的 IOServiceAddMatchingNotification 应该如下所示:
returnCode = IOServiceAddMatchingNotification( notifyPort, kIOTerminatedNotification, matchingDict, DeviceDisconnected, NULL, &portIterator );
其次,DeviceDisconnected 函数应如下所示:
void DeviceDisconnected( void *refCon, io_iterator_t iterator )
{
kern_return_t returnCode = KERN_FAILURE;
io_object_t usbDevice;
while ( ( usbDevice = ioIteratorNext( iterator ) ) )
{
returnCode = IOObjectRelease( usbDevice );
if ( returnCode != kIOReturnSuccess )
{
NSLog( @"Couldn't release raw device object: %08x.", returnCode );
}
}
[[NSNotificationCenter defaultCenter] postNotificationName:deviceDiconnectedNotification object:nil userInfo:nil];
}