如何通过xcode编程使MAC机器和HID的USB单片机设备进行通讯
2014-09-03 09:06
549 查看
头文件
类文件
#import <Foundation/Foundation.h> #include <IOKit/hid/IOHIDLib.h> #include <IOKit/hid/IOHIDKeys.h> @protocol UsbHIDDelegate <NSObject> @optional - (void)usbhidDidRecvData:(uint8_t*)recvData length:(CFIndex)reportLength; - (void)usbhidDidMatch; - (void)usbhidDidRemove; @end @interface UsbHID : NSObject { IOHIDManagerRef managerRef; IOHIDDeviceRef deviceRef; } @property(nonatomic,strong)id<UsbHIDDelegate> delegate; + (UsbHID *)sharedManager; - (void)connectHID; - (void)senddata:(char*)outbuffer; - (IOHIDManagerRef)getManageRef; - (void)setManageRef:(IOHIDManagerRef)ref; - (IOHIDDeviceRef)getDeviceRef; - (void)setDeviceRef:(IOHIDDeviceRef)ref; @end
类文件
#import "UsbHID.h" @implementation UsbHID static UsbHID *_sharedManager = nil; @synthesize delegate; static void MyInputCallback(void* context, IOReturn result, void* sender, IOHIDReportType type, uint32_t reportID, uint8_t *report,CFIndex reportLength) { [[[UsbHID sharedManager] delegate] usbhidDidRecvData:report length:reportLength]; } static void Handle_DeviceMatchingCallback(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) { [[UsbHID sharedManager] setDeviceRef:inIOHIDDeviceRef]; char *inputbuffer = malloc(64); IOHIDDeviceRegisterInputReportCallback([[UsbHID sharedManager]getDeviceRef], (uint8_t*)inputbuffer, 64, MyInputCallback, NULL); NSLog(@"%p设备插入,现在usb设备数量:%ld",(void *)inIOHIDDeviceRef,USBDeviceCount(inSender)); [[[UsbHID sharedManager] delegate] usbhidDidMatch]; } static void Handle_DeviceRemovalCallback(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) { [[UsbHID sharedManager] setDeviceRef:nil]; NSLog(@"%p设备拔出,现在usb设备数量:%ld",(void *)inIOHIDDeviceRef,USBDeviceCount(inSender)); [[[UsbHID sharedManager] delegate] usbhidDidRemove]; } static long USBDeviceCount(IOHIDManagerRef HIDManager){ CFSetRef devSet = IOHIDManagerCopyDevices(HIDManager); if(devSet) return CFSetGetCount(devSet); return 0; } +(UsbHID *)sharedManager { @synchronized( [UsbHID class] ){ if(!_sharedManager) _sharedManager = [[self alloc] init]; return _sharedManager; } return nil; } +(id)alloc { @synchronized ([UsbHID class]){ NSAssert(_sharedManager == nil, @"Attempted to allocated a second instance"); _sharedManager = [super alloc]; return _sharedManager; } return nil; } - (id)init { self = [super init]; if (self) { managerRef = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); IOHIDManagerScheduleWithRunLoop(managerRef, CFRunLoopGetMain(), kCFRunLoopDefaultMode); IOReturn ret = IOHIDManagerOpen(managerRef, 0L); if (ret != kIOReturnSuccess) { NSAlert* alert = [NSAlert alertWithMessageText:@"error" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"打开设备失败!"]; [alert runModal]; return self; } const long vendorID = 0x1391; const long productID = 0x2111; NSMutableDictionary* dict= [NSMutableDictionary dictionary]; [dict setValue:[NSNumber numberWithLong:productID] forKey:[NSString stringWithCString:kIOHIDProductIDKey encoding:NSUTF8StringEncoding]]; [dict setValue:[NSNumber numberWithLong:vendorID] forKey:[NSString stringWithCString:kIOHIDVendorIDKey encoding:NSUTF8StringEncoding]]; IOHIDManagerSetDeviceMatching(managerRef, (__bridge CFMutableDictionaryRef)dict); IOHIDManagerRegisterDeviceMatchingCallback(managerRef, &Handle_DeviceMatchingCallback, NULL); IOHIDManagerRegisterDeviceRemovalCallback(managerRef, &Handle_DeviceRemovalCallback, NULL); NSSet* allDevices = (__bridge NSSet*)(IOHIDManagerCopyDevices(managerRef)); NSArray* deviceRefs = [allDevices allObjects]; if (deviceRefs.count==0) { } } return self; } - (void)dealloc { IOReturn ret = IOHIDDeviceClose(deviceRef, 0L); if (ret == kIOReturnSuccess) { deviceRef = nil; } ret = IOHIDManagerClose(managerRef, 0L); if (ret == kIOReturnSuccess) { managerRef = nil; } } - (void)connectHID { NSSet* allDevices = (__bridge NSSet*)(IOHIDManagerCopyDevices(managerRef)); NSArray* deviceRefs = [allDevices allObjects]; deviceRef = (deviceRefs.count)?(__bridge IOHIDDeviceRef)[deviceRefs objectAtIndex:0]:nil; } - (void)senddata:(char*)outbuffer { if (!deviceRef) { return ; } IOReturn ret = IOHIDDeviceSetReport(deviceRef, kIOHIDReportTypeOutput, 0, (uint8_t*)outbuffer, sizeof(outbuffer)); if (ret != kIOReturnSuccess) { NSAlert* alert = [NSAlert alertWithMessageText:@"error" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"发送数据失败!"]; [alert runModal]; } } - (IOHIDManagerRef)getManageRef { return managerRef; } - (void)setManageRef:(IOHIDManagerRef)ref { managerRef = ref; } - (IOHIDDeviceRef)getDeviceRef { return deviceRef; } - (void)setDeviceRef:(IOHIDDeviceRef)ref { deviceRef = ref; } @end
相关文章推荐
- usb开发笔记之三:如何编写应用程序与 USB HID 设备通讯(读写USB HID 设备)
- Ubuntu(15):如何通过蓝牙与手机进行AT指令通讯
- VC编程实现与usb设备通信:计算机向单片机发送
- stm32 USB hid设备与PC进行双向数据传输时PC不识别USB设备
- linux设备如何通过USB网络共享与手机通信(包含安卓手机以及iphone)
- Android手机如何通过USB共享网络给Mac?
- 如何通过编程方式将SharePoint中的Infopath表单及附件进行归档
- 如何通过Xcode 5中集成的XCTest框架进行简单的单元测试
- 如何通过 USB 设备来安装 CentOS
- 如何在MAC机器中实现移动设备WiFI上网(没有专门的无线路由器的情况)
- android usb与自定义HID设备通讯
- 如何让处于两台机器上的虚拟机进行通讯
- 如何查找Mac上的USB存储设备使用痕迹
- 如何通过 WinUSB 功能访问 USB 设备
- 如何进行编码和通过 Visual C# InfoPath 中以编程方式解码文件附件
- 如何在Xcode 4.2 下进行 iPod touch 2代、iPhone 3G等设备的真机调试(转)?
- C# usb Hid 访问上位机USB通讯实例 实现设备在线或者离线和发送接收数据通讯功能
- LibUSB通过SetReport()请求与USBHID设备通信
- 如何在Linux下利用Libusb与HID USB设备通信!
- 如何使用CC2540 USB-Dongle进行抓取蓝牙通讯数据包