Взгляните на IOServiceAddMatchingNotification()
и связанных с ними функций. Я работал с ним только в контексте последовательных портов (которые на самом деле являются USB-последовательными адаптерами, хотя это и не имеет значения), но оно должно быть применимо к любому доступному устройству IOKit. Я не уверен в отношении Bluetooth, но он должен по крайней мере работать на устройствах USB. Вот фрагмент кода, я использую:
IONotificationPortRef notificationPort = IONotificationPortCreate(kIOMasterPortDefault);
CFRunLoopAddSource(CFRunLoopGetCurrent(),
IONotificationPortGetRunLoopSource(notificationPort),
kCFRunLoopDefaultMode);
CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOSerialBSDServiceValue);
CFRetain(matchingDict); // Need to use it twice and IOServiceAddMatchingNotification() consumes a reference
CFDictionaryAddValue(matchingDict, CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDRS232Type));
io_iterator_t portIterator = 0;
// Register for notifications when a serial port is added to the system
kern_return_t result = IOServiceAddMatchingNotification(notificationPort,
kIOPublishNotification,
matchingDictort,
SerialDeviceWasAddedFunction,
self,
&portIterator);
while (IOIteratorNext(portIterator)) {}; // Run out the iterator or notifications won't start (you can also use it to iterate the available devices).
// Also register for removal notifications
IONotificationPortRef terminationNotificationPort = IONotificationPortCreate(kIOMasterPortDefault);
CFRunLoopAddSource(CFRunLoopGetCurrent(),
IONotificationPortGetRunLoopSource(terminationNotificationPort),
kCFRunLoopDefaultMode);
result = IOServiceAddMatchingNotification(terminationNotificationPort,
kIOTerminatedNotification,
matchingDict,
SerialPortWasRemovedFunction,
self, // refCon/contextInfo
&portIterator);
while (IOIteratorNext(portIterator)) {}; // Run out the iterator or notifications won't start (you can also use it to iterate the available devices).
Мои SerialPortDeviceWasAddedFunction()
и SerialPortWasRemovedFunction()
называются когда последовательный порт становится доступным в системе или удаляется, соответственно.
Соответствующая документация is here, особенно под заголовком Getting Notifications of Device Arrival and Departure
.
Хм ... я пытался использовать свой код, созданный как функции обратного вызова, добавлены некоторые заголовки IOKit ... Но есть неопределенная ссылка на " notificationPort ", я что-то упускаю? – Rodrigo
Извините. Я копирую/вставляю этот код непосредственно из существующего проекта. Я не имел в виду, чтобы это было полным решением, просто пример того, как получать уведомления. Во всяком случае, я обновил код в своем ответе, включив в него создание уведомлений и планирование его на runloop. Имейте в виду, что этот код относится к уведомлениям о портах RS-232. Это должно быть примером, но его нужно будет изменить для вашего приложения. –
Спасибо, Андрей. Я изменил IOServiceMatching на kIOHIDDeviceKey и удалил строку CFDictionaryAddValue, и она сработала. Но только один раз. После этого мне нужно снова зарегистрироваться для уведомления, это правильно? – Rodrigo