框架:IOKit.framework
简介:用于Mac OS 上位机软件根据USB线连接下位机硬件,与之进行数据交互,通讯。
开发步骤:
1、导入依赖头文件
#include <IOKit/hid/IOHIDLib.h>
2、初始化IOHIDManager
IOHIDManagerRef managerRef = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
3、进行配对设置,可以过滤其他USB设备。
1).无配对设备
IOHIDManagerSetDeviceMatching(HIDManager, NULL);
2).单类设备配对
NSMutableDictionary* dict= [NSMutableDictionary dictionary];
[dict setValue:pid forKey:[NSString stringWithCString:kIOHIDProductIDKey encoding:NSUTF8StringEncoding]];
[dict setValue:vid forKey:[NSString stringWithCString:kIOHIDVendorIDKey encoding:NSUTF8StringEncoding]];
IOHIDManagerSetDeviceMatching(managerRef, (__bridge CFMutableDictionaryRef)dict);
3).多种设备配对设置
NSMutableArray *arr = [NSMutableArray array];
[arr addObject:dict];
IOHIDManagerSetDeviceMatchingMultiple(managerRef, (__bridge CFMutableArrayRef)arr);
4、注册插拔设备的callback
//注册插入callback
IOHIDManagerRegisterDeviceMatchingCallback(managerRef, &Handle_DeviceMatchingCallback, NULL);
//注册拔出callback
IOHIDManagerRegisterDeviceRemovalCallback(managerRef, &Handle_DeviceRemovalCallback, NULL);
5、加入RunLoop
IOHIDManagerScheduleWithRunLoop(managerRef, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
6、打开IOHIDManager
IOReturn ret = IOHIDManagerOpen(managerRef, kIOHIDOptionsTypeNone);
if (ret == kIOReturnSuccess) {
NSLog(@"IOHIDManager打开成功");
}
7、实现插拔callback
static void Handle_DeviceMatchingCallback(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) {
NSLog(@"插入:%p",(void *)inIOHIDDeviceRef);
}
static void Handle_DeviceRemovalCallback(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) {
NSLog(@"拔出:%p设备",(void *)inIOHIDDeviceRef);
}
8、插入设备获取到IOHIDDeviceRef inIOHIDDeviceRef后,打开IOHIDDeviceRef
IOOptionBits options = 0;
IOReturn ret = IOHIDDeviceOpen(inIOHIDDeviceRef,options);
if (ret == kIOReturnSuccess) {
NSLog(@"打开成功");
}
9、注册的接收数据callback
IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, (uint8_t*)inputbuffer, 64, MyInputCallback, NULL);
10、实现接收数据callback方法,即可接收数据
static void MyInputCallback(void* context, IOReturn result, void* sender, IOHIDReportType type, uint32_t reportID, uint8_t *report,CFIndex reportLength) {
RobotPenUSBLog(@"%s",report);
}
11、向USB设备发送指令
IOReturn ret = IOHIDDeviceSetReport(inIOHIDDeviceRef, kIOHIDReportTypeOutput, 0, (uint8_t*)buffer, length);
if (ret != kIOReturnSuccess) {
NSLog(@"指令发送失败");
}
12、断开设备
IOReturn ret = IOHIDDeviceClose(inIOHIDDeviceRef,0L);
if (ret == kIOReturnSuccess) {
NSLog(@"断开成功");
}
更多内容请参考:苹果官方开发者文档
因为有很多朋友私信我HID 开发过程中遇到的一些问题,有的涉及到公司的具体业务,不便透露,这篇文章写的有点杂乱笼统,所以我整理了一篇新的带实例的文章,封装好的工程修改对应ID之后应该可以直接连接下位机设备进行测试的 😊
time:20190926
我新整理的 带实例demo的 USB HID 通讯文章