-//
// HidManager.m
// MouseSdk
//
#import "AiDeviceAuthManager.h"
#import "TlwTools.h"
#import "Tlw2ReceiveManager.h"
+
@interface HidManager ()
@property(nonatomic, assign) IOHIDManagerRef hidManager;///hid管理
@property(nonatomic, assign) IOHIDDeviceRef deviceInfoCha;//设备信息通道
-@property(nonatomic, assign) IOHIDDeviceRef voiceCha;//语音通道
+@property(nonatomic, assign) IOHIDDeviceRef voiceRef;//声音事件
+@property(nonatomic, assign) IOHIDDeviceRef moveRef;//鼠标或键盘的基本事件
+
@property(nonatomic, strong) Tlw2ReceiveManager *tlw2Receiver;
+@property(nonatomic, strong) NSMutableDictionary *deviceBuffers; // 设备缓冲区映射 (key: NSValue(pointer), value: IOHIDDeviceRef)
@end
@implementation HidManager
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
manager = [[HidManager alloc]init];
+ manager.deviceBuffers = [NSMutableDictionary dictionary];
});
return manager;
}
#pragma mark - Hid CallBack
/// 匹配到设备回调
-static void hidAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) {
+static void hidAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef deviceRef) {
if ([DeviceManger shared].isConneted) {
-// [[HidManager shared] showLog:(@"当前处于连接状态,对监听到有USB 插入 的事件不做处理")];
+ // [[HidManager shared] showLog:(@"当前处于连接状态,对监听到有USB 插入 的事件不做处理")];
return;
}
- uint32_t pid = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDProductIDKey));
- uint32_t vid = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDVendorIDKey));
- uint32_t page = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDPrimaryUsagePageKey));
- uint32_t usage = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDPrimaryUsageKey));
-// [[HidManager shared] showLog: [NSString stringWithFormat:@"发现设备 %@",inIOHIDDeviceRef]];
- if(vid == 3468 && pid == 786){
- if (page == 65282 && usage == 2) {
- [HidManager shared].productType = AiMouseProductType_m8;
- [HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
- unsigned char InputBuffer[64];
- IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), &hidReceiveData, NULL);
-
- IOReturn result = IOHIDDeviceOpen(inIOHIDDeviceRef, kIOHIDOptionsTypeNone);
- if (result != kIOReturnSuccess) {
- [[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备失败! %d",result]];
- [[AiDeviceAuthManager shared] showHidAlert];
- return;
- }else{
- [[HidManager shared] showLog:@"打开设备成功!"];
- [HidManager shared].isOpen = true;
- [HidManager shared].connectStateCallBack(true) ;
- }
- }
-// else if (page == 1 && usage == 2){
-// [HidManager shared].productType = AiMouseProductType_m8;
-// [HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
-// unsigned char InputBuffer[64];
-// IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), &hidReceiveData, NULL);
-//
-// IOReturn result = IOHIDDeviceOpen(inIOHIDDeviceRef, kIOHIDOptionsTypeNone);
-// if (result != kIOReturnSuccess) {
-// [[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备失败! %d",result]];
-// [[AiDeviceAuthManager shared] showHidAlert];
-// return;
-// }else{
-// [[HidManager shared] showLog:@"打开设备成功!"];
-// // [HidManager shared].connectStateCallBack(true) ;
-// }
-// }
- return;
+
+ uint32_t pid = IOHIDDevGetUInt32Property(deviceRef, CFSTR(kIOHIDProductIDKey));
+ uint32_t vid = IOHIDDevGetUInt32Property(deviceRef, CFSTR(kIOHIDVendorIDKey));
+ uint32_t page = IOHIDDevGetUInt32Property(deviceRef, CFSTR(kIOHIDPrimaryUsagePageKey));
+ uint32_t usage = IOHIDDevGetUInt32Property(deviceRef, CFSTR(kIOHIDPrimaryUsageKey));
+ [[HidManager shared] showLog: [NSString stringWithFormat:@"发现设备 %@",deviceRef]];
+
+ // 为设备创建专用缓冲区
+ unsigned char *inputBuffer = (unsigned char *)malloc(64);
+ NSValue *bufferKey = [NSValue valueWithPointer:inputBuffer];
+ [[HidManager shared].deviceBuffers setObject:(__bridge id)deviceRef forKey:bufferKey];
+
+ if(vid == 3468 && pid == 786){
+ if (page == 65282 && usage == 2) {
+ [HidManager shared].productType = AiMouseProductType_m8;
+ [HidManager shared].deviceInfoCha = deviceRef;
+ IOHIDDeviceRegisterInputReportCallback(deviceRef, inputBuffer, 64, &hidReceiveData, NULL);
+
+ IOReturn result = IOHIDDeviceOpen(deviceRef, kIOHIDOptionsTypeNone);
+ if (result != kIOReturnSuccess) {
+ [[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备失败! %d",result]];
+ [[AiDeviceAuthManager shared] showHidAlert];
+ free(inputBuffer); // 释放未使用的缓冲区
+ return;
+ }else{
+ [[HidManager shared] showLog:@"打开设备成功!"];
+ [HidManager shared].connectStateCallBack(true) ;
+ }
+ }
+ return;
}
if((vid == 0x248a && pid == 0x6092)){
+ if ([HidManager shared].deviceInfoCha) {
+ return;
+ }
+ [HidManager shared].deviceInfoCha = deviceRef;
[HidManager shared].productType = AiMouseProductType_keyboard;
- [HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
- unsigned char InputBuffer[64];
- IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), &hidReceiveData, NULL);
+ IOHIDDeviceRegisterInputReportCallback(deviceRef, inputBuffer, 64, &hidReceiveData, NULL);
IOReturn result = IOHIDDeviceOpen([HidManager shared].deviceInfoCha, kIOHIDOptionsTypeNone);
if (result != kIOReturnSuccess) {
[[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备失败! %d",result]];
[[AiDeviceAuthManager shared] showHidAlert];
+ free(inputBuffer); // 释放未使用的缓冲区
return;
}else{
[[HidManager shared] showLog:@"打开设备成功!"];
- [HidManager shared].isOpen = true;
- [HidManager shared].connectStateCallBack(true) ;
+// dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
+// dispatch_after(delayTime, dispatch_get_main_queue(), ^{
+ [HidManager shared].connectStateCallBack(true);
+// });
}
return;
}
|| (vid == 0x32c2 && pid == 0x0066)
){
[HidManager shared].productType = AiMouseProductType_n;
- [HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
- unsigned char InputBuffer[64];
- IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), &hidReceiveData, NULL);
+ [HidManager shared].deviceInfoCha = deviceRef;
+ IOHIDDeviceRegisterInputReportCallback(deviceRef, inputBuffer, 64, &hidReceiveData, NULL);
IOReturn result = IOHIDDeviceOpen([HidManager shared].deviceInfoCha, kIOHIDOptionsTypeNone);
if (result != kIOReturnSuccess) {
[[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备失败! %d",result]];
[[AiDeviceAuthManager shared] showHidAlert];
+ free(inputBuffer); // 释放未使用的缓冲区
return;
}else{
[[HidManager shared] showLog:@"打开设备成功!"];
- [HidManager shared].isOpen = true;
[HidManager shared].connectStateCallBack(true) ;
}
}
else if(vid == 0x10D6 && pid == 0xB008){
+ //泰凌微只有一个通道
[HidManager shared].productType = AiMouseProductType_tlw;
- [HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
- unsigned char InputBuffer[64];
- IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), &hidReceiveData, NULL);
+ [HidManager shared].deviceInfoCha = deviceRef;
+ IOHIDDeviceRegisterInputReportCallback(deviceRef, inputBuffer, 64, &hidReceiveData, NULL);
IOReturn result = IOHIDDeviceOpen([HidManager shared].deviceInfoCha, kIOHIDOptionsTypeNone);
if (result != kIOReturnSuccess) {
[[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备失败! %d",result]];
[[AiDeviceAuthManager shared] showHidAlert];
+ free(inputBuffer); // 释放未使用的缓冲区
return;
}else{
[[HidManager shared] showLog:@"打开设备成功!"];
- [HidManager shared].isOpen = true;
[HidManager shared].connectStateCallBack(true) ;
}
}
- else if(vid == 0x6675 && pid == 0x8601){
+ else if(vid == 26229 && pid == 34305){
[HidManager shared].productType = AiMouseProductType_frk;
AiMouse.shared.tlw2 = false;
if(page == 1 && usage == 0){
- unsigned char InputBuffer[128];
- IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), hidReceiveData, NULL);
- IOReturn result = IOHIDDeviceOpen(inIOHIDDeviceRef, kIOHIDOptionsTypeNone);
+ IOHIDDeviceRegisterInputReportCallback(deviceRef, inputBuffer, 64, hidReceiveData, NULL);
+ IOReturn result = IOHIDDeviceOpen(deviceRef, kIOHIDOptionsTypeNone);
if (result != kIOReturnSuccess) {
- [[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备信息失败! %d",result]];
+ [[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备通道失败! %d",result]];
[[AiDeviceAuthManager shared] showHidAlert];
- return;
+ free(inputBuffer); // 释放未使用的缓冲区
}else{
- [HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
-
- [[HidManager shared] showLog:@"打开设备信息成功!"];
- if([HidManager shared].voiceCha != nil){
- [HidManager shared].isOpen = true;
+ [HidManager shared].deviceInfoCha = deviceRef;
+ [[HidManager shared] showLog:@"打开设备通道成功!"];
+ if (([HidManager shared].deviceInfoCha != nil) &&
+ ([HidManager shared].voiceRef != nil) &&
+ ([HidManager shared].moveRef != nil)) {
[HidManager shared].connectStateCallBack(true);
}
}
}
else if(page == 65283 && usage == 0){
- unsigned char InputBuffer[128];
- IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), hidReceiveData, NULL);
-
- IOReturn result = IOHIDDeviceOpen(inIOHIDDeviceRef, kIOHIDOptionsTypeNone);
+ IOHIDDeviceRegisterInputReportCallback(deviceRef, inputBuffer, 64, hidReceiveData, NULL);
+ IOReturn result = IOHIDDeviceOpen(deviceRef, kIOHIDOptionsTypeNone);
if (result != kIOReturnSuccess) {
[[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备voice失败! %d",result]];
[[AiDeviceAuthManager shared] showHidAlert];
- return;
- }else{
- [HidManager shared].voiceCha = inIOHIDDeviceRef;
-
- [[HidManager shared] showLog:@"打开设备voice成功!"];
- if([HidManager shared].deviceInfoCha != nil){
- [HidManager shared].isOpen = true;
+ free(inputBuffer); // 释放未使用的缓冲区
+ }
+ else{
+ [HidManager shared].voiceRef = deviceRef;
+ if (([HidManager shared].deviceInfoCha != nil) &&
+ ([HidManager shared].voiceRef != nil) &&
+ ([HidManager shared].moveRef != nil)) {
+ [HidManager shared].connectStateCallBack(true);
+ }
+ }
+ }
+ else if(page == 1 && usage == 6){
+ //鼠标坐标移动
+ IOHIDDeviceRegisterInputReportCallback(deviceRef, inputBuffer, 64, mouseData, NULL);
+ IOReturn result = IOHIDDeviceOpen(deviceRef, kIOHIDOptionsTypeNone);
+ if (result != kIOReturnSuccess) {
+ [[HidManager shared] showLog:[NSString stringWithFormat:@"鼠标监听失败! %d",result]];
+ free(inputBuffer); // 释放未使用的缓冲区
+ }
+ else{
+ [HidManager shared].moveRef = deviceRef;
+ if (([HidManager shared].deviceInfoCha != nil) &&
+ ([HidManager shared].voiceRef != nil) &&
+ ([HidManager shared].moveRef != nil)) {
[HidManager shared].connectStateCallBack(true);
}
}
}
}
- else if(vid == 0x6675 && pid == 0x8602){
+ else if(vid == 26229 && pid == 34306){
[HidManager shared].productType = AiMouseProductType_frk;
AiMouse.shared.tlw2 = true;
[HidManager shared].tlw2Receiver = [[Tlw2ReceiveManager alloc] init];
- if(page == 65519 && usage == 0){
- unsigned char InputBuffer[128];
- IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), hidReceiveData, NULL);
+ if(page == 65519 && usage == 0){
+ IOHIDDeviceRegisterInputReportCallback(deviceRef, inputBuffer, 64, hidReceiveData, NULL);
- IOReturn result = IOHIDDeviceOpen(inIOHIDDeviceRef, kIOHIDOptionsTypeNone);
+ IOReturn result = IOHIDDeviceOpen(deviceRef, kIOHIDOptionsTypeNone);
if (result != kIOReturnSuccess) {
[[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备voice失败! %d",result]];
[[AiDeviceAuthManager shared] showHidAlert];
+ free(inputBuffer); // 释放未使用的缓冲区
return;
}else{
- [HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
-
+ [HidManager shared].deviceInfoCha = deviceRef;
[[HidManager shared] showLog:@"打开设备voice成功!"];
- if([HidManager shared].deviceInfoCha != nil){
- [HidManager shared].isOpen = true;
+ if (([HidManager shared].deviceInfoCha != nil) &&
+ ([HidManager shared].moveRef != nil)) {
+ [HidManager shared].connectStateCallBack(true);
+ }
+ }
+ }
+ else if(page == 1 && usage == 2){
+ //鼠标坐标移动
+ IOHIDDeviceRegisterInputReportCallback(deviceRef, inputBuffer, 64, mouseData, NULL);
+ IOReturn result = IOHIDDeviceOpen(deviceRef, kIOHIDOptionsTypeNone);
+ if (result != kIOReturnSuccess) {
+ [[HidManager shared] showLog:[NSString stringWithFormat:@"鼠标监听失败! %d",result]];
+ free(inputBuffer); // 释放未使用的缓冲区
+ }
+ else{
+ [HidManager shared].moveRef = deviceRef;
+ if (([HidManager shared].deviceInfoCha != nil) &&
+ ([HidManager shared].moveRef != nil)) {
[HidManager shared].connectStateCallBack(true);
}
}
}
}
+/// 关闭特定设备
+- (void)closeDevice:(IOHIDDeviceRef)deviceRef {
+ if (deviceRef) {
+ // 查找设备对应的缓冲区并释放
+ NSValue *bufferKeyToRemove = nil;
+ for (NSValue *key in self.deviceBuffers) {
+ IOHIDDeviceRef bufferDevice = (__bridge IOHIDDeviceRef)[self.deviceBuffers objectForKey:key];
+ if (bufferDevice == deviceRef) {
+ unsigned char *buffer = (unsigned char *)[key pointerValue];
+ free(buffer);
+ bufferKeyToRemove = key;
+ break;
+ }
+ }
+
+ if (bufferKeyToRemove) {
+ [self.deviceBuffers removeObjectForKey:bufferKeyToRemove];
+ }
+
+ // 取消注册回调
+ IOHIDDeviceRegisterInputReportCallback(deviceRef, NULL, 0, NULL, NULL);
+
+ // 关闭设备
+ IOReturn ret = IOHIDDeviceClose(deviceRef, kIOHIDOptionsTypeNone);
+ if (ret != kIOReturnSuccess) {
+ [self showLog:(@"关闭device失败!")];
+ }
+
+ // 清除引用
+ if (self.deviceInfoCha == deviceRef) {
+ self.deviceInfoCha = nil;
+ } else if (self.voiceRef == deviceRef) {
+ self.voiceRef = nil;
+ } else if (self.moveRef == deviceRef) {
+ self.moveRef = nil;
+ }
+ }
+}
+
/// 设备移除回调
-static void hidDisAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) {
- [[HidManager shared] showLog:[NSString stringWithFormat:@"拔出设备 %@ ",inIOHIDDeviceRef]];
- if([HidManager shared].deviceInfoCha == inIOHIDDeviceRef){
- [HidManager shared].deviceInfoCha = nil;
- [HidManager shared].voiceCha = nil;
-// [HidManager shared].hidManager = nil;
- [HidManager shared].isOpen = false;
+static void hidDisAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef deviceRef) {
+ [[HidManager shared] showLog:[NSString stringWithFormat:@"拔出设备 %@ ",deviceRef]];
+ [[HidManager shared] closeDevice:deviceRef];
+
+ // 检查是否所有设备都已断开
+ if ([HidManager shared].deviceInfoCha == nil) {
[HidManager shared].connectStateCallBack(false) ;
}
}
+static void mouseData(void* context, IOReturn result, void* sender, IOHIDReportType type, uint32_t reportID, uint8_t *report,CFIndex reportLength){
+ // NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
+ // [[HidManager shared] showLog:[NSString stringWithFormat:@"[鼠标事件]%@",@""]];
+ [[HidManager shared] checkedConected];
+}
+
static void hidReceiveData(void* context, IOReturn result, void* sender, IOHIDReportType type, uint32_t reportID, uint8_t *report,CFIndex reportLength){
- NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
- if (data.length <= 4) {
- return;
- }
-// [[HidManager shared] showLog:[NSString stringWithFormat:@"[reciv] %@",data]];
- // return;
+ [[HidManager shared] checkedConected];
+ // NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
+ // if (data.length <= 4) {
+ // return;
+ // }
+ // [[HidManager shared] showLog:[NSString stringWithFormat:@"[reciv] reportID = %ul %@",reportID,data]];
+ // return;
if([HidManager shared].productType == AiMouseProductType_keyboard){
NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
[HidManager shared].receiveInfoDataCallBack(data);
else if([HidManager shared].productType == AiMouseProductType_tlw){
if (report[0] == 0x01 || report[0] == 0x02) {
//鼠标键盘活动事件
+ [[HidManager shared] checkedConected];
return;
}
uint32_t page = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsagePageKey));
uint32_t usage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsageKey));
-// [[HidManager shared] showLog:[NSString stringWithFormat:@"[reciv]page = %d,usage = %d, %@",page,usage,data]];
if(page == 1 && usage == 2){
NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
[HidManager shared].receiveInfoDataCallBack(data);
}
}
else if([HidManager shared].productType == AiMouseProductType_frk){
-
NSInteger len = get_data_len(report, (int)reportLength);
NSData *data = [[NSData alloc] initWithBytes:report length:len];
uint32_t page = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsagePageKey));
}
}
+//检查是否已连接
+- (void)checkedConected{
+ if (![DeviceManger shared].isConneted) {
+ [HidManager shared].connectStateCallBack(true);
+ }
+}
+
#pragma mark - public
-- (void)open{
- [self close];
- //初始化
- self.deviceInfoCha = nil;
- self.voiceCha = nil;
- self.hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
- IOHIDManagerScheduleWithRunLoop(self.hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
- IOReturn ret = IOHIDManagerOpen(self.hidManager, 0L);
- if (ret != kIOReturnSuccess) {
- [self showLog:(@"打开hid失败!")];
- }else{
- [self showLog:(@"打开hid成功!")];
+
+- (void)openHid{
+ // [self close];
+ if (self.hidManager == nil) {
+ self.deviceInfoCha = nil;
+ self.hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
+ IOHIDManagerScheduleWithRunLoop(self.hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
+ IOReturn ret = IOHIDManagerOpen(self.hidManager, 0L);
+ if (ret != kIOReturnSuccess) {
+ [self showLog:(@"打开hid失败!")];
+ }else{
+ [self showLog:(@"打开hid成功!")];
+ }
+ //设置匹配设备
+ NSMutableDictionary* dict= [NSMutableDictionary dictionary];
+ IOHIDManagerSetDeviceMatching(self.hidManager, (__bridge CFMutableDictionaryRef)dict);
+ //设置匹配到设备回调
+ IOHIDManagerRegisterDeviceMatchingCallback(self.hidManager, &hidAppearDevice, NULL);
+ //设置移除设备回调
+ IOHIDManagerRegisterDeviceRemovalCallback(self.hidManager, &hidDisAppearDevice, NULL);
}
- //设置匹配设备
- 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(self.hidManager, (__bridge CFMutableDictionaryRef)dict);
- //设置匹配到设备回调
- IOHIDManagerRegisterDeviceMatchingCallback(self.hidManager, &hidAppearDevice, NULL);
- //设置移除设备回调
- IOHIDManagerRegisterDeviceRemovalCallback(self.hidManager, &hidDisAppearDevice, NULL);
}
-- (BOOL)close{
+- (BOOL)closeHid{
+ [self showLog:@"关闭hid"];
+ // 关闭所有已连接的设备
+ if (self.deviceInfoCha) {
+ [self closeDevice:self.deviceInfoCha];
+ }
+
+ if (self.voiceRef) {
+ [self closeDevice:self.voiceRef];
+ }
+
+ if (self.moveRef) {
+ [self closeDevice:self.moveRef];
+ }
+
+ // 清空缓冲区字典
+ for (NSValue *key in self.deviceBuffers) {
+ unsigned char *buffer = (unsigned char *)[key pointerValue];
+ free(buffer);
+ }
+ [self.deviceBuffers removeAllObjects];
+
+ // 关闭HID管理器
if (self.hidManager != nil) {
- if (self.deviceInfoCha != nil) {
- // 取消所有报告回调
- IOReturn ret = IOHIDDeviceClose(self.deviceInfoCha, kIOHIDOptionsTypeNone);
- if (ret != kIOReturnSuccess) {
- [self showLog:(@"关闭device失败!")];
- return false;
- }
- }
- if (self.voiceCha != nil) {
- IOReturn ret = IOHIDDeviceClose(self.voiceCha, kIOHIDOptionsTypeNone);
- if (ret != kIOReturnSuccess) {
- [self showLog:(@"关闭voice失败!")];
- return false;
- }
- }
+ // 取消注册回调
+ IOHIDManagerRegisterDeviceMatchingCallback(self.hidManager, NULL, NULL);
+ IOHIDManagerRegisterDeviceRemovalCallback(self.hidManager, NULL, NULL);
IOReturn ret = IOHIDManagerClose(self.hidManager, 0);
if (ret != kIOReturnSuccess) {
- [self showLog:(@"关闭hid失败!")];
- return false;
+ [self showLog:[NSString stringWithFormat:@"关闭hid失败! 错误码:%d", ret]];
}
- self.deviceInfoCha = nil;
- self.voiceCha = nil;
- self.hidManager = nil;
+ [self showLog:@"IOHIDManager已关闭"];
+ self.hidManager = nil;
}
+
return true;
}
+
/// 发送数据给设备
-(void)writeToDevice:(NSData *)data{
if(self.deviceInfoCha == nil){
[self showLog:@"sendData: 请先连上设备"];
return;
}
-// data = [self addFullData:data];
- [self showLog:[NSString stringWithFormat:@"[send] %@ %@",self.deviceInfoCha,data]];
- IOReturn ret = IOHIDDeviceSetReport(self.deviceInfoCha, kIOHIDReportTypeOutput, 0x05, data.bytes, data.length);
- if (ret != kIOReturnSuccess) {
- [self showLog:[NSString stringWithFormat:@"发送失败! code = %d",ret]];
- }else{
- // [self showLog:@"发送成功!"];
- }
+ [self showLog:[NSString stringWithFormat:@"[send]%@",[TlwTools dataToHexString:data]]];
+ IOHIDDeviceSetReport(self.deviceInfoCha, kIOHIDReportTypeOutput, 0x05, data.bytes, data.length);
}
- (NSData *)addFullData:(NSData *)data{
}
/// 获取对应属性值
-static uint32_t IOHIDDevGetUInt32Property(IOHIDDeviceRef inIOHIDDeviceRef, CFStringRef inKey) {
+static uint32_t IOHIDDevGetUInt32Property(IOHIDDeviceRef deviceRef, CFStringRef inKey) {
uint32_t outValue = 0;
- if (inIOHIDDeviceRef != NULL) {
- CFTypeRef tCFTypeRef = IOHIDDeviceGetProperty(inIOHIDDeviceRef, inKey);
+ if (deviceRef != NULL) {
+ CFTypeRef tCFTypeRef = IOHIDDeviceGetProperty(deviceRef, inKey);
if (tCFTypeRef != NULL && (CFNumberGetTypeID() == CFGetTypeID(tCFTypeRef)) ) {
Boolean result = CFNumberGetValue((CFNumberRef) tCFTypeRef, kCFNumberSInt32Type, &outValue);
if (!result) {