/// 接收到数据帧
- (void)didReceiveFrameData:(NSData *)data;
+
+/// 收到hid鉴权收据
+- (void)didReceiveHidAuthData:(NSData *)data;
@end
NS_ASSUME_NONNULL_END
self.recvData = [[NSMutableData alloc] init];
}
else if([str isEqualTo:@"$$-\n"]){
+ NSString *str1 = [AiMouseTools dataToHexString:self.recvData];
+ NSLog(@"收到完整数据 = %@",str1);
//结束
if(self.didReceiveFullData){
self.didReceiveFullData(self.recvData);
[self.recvData appendData:data];
}
}
+
+- (void)didReceiveHidAuthData:(NSData *)data{
+ NSString *str = [AiMouseTools dataToHexString:data];
+ NSLog(@"收到数据 = %@",str);
+ if ([str hasPrefix:@"2D2424"]) {
+ //开始
+ NSData *subData = [data subdataWithRange:NSMakeRange(3, data.length - 4)];
+ NSString *str1 = [AiMouseTools dataToHexString:subData];
+ NSLog(@"实收数据 = %@",str1);
+ self.recvData = [[NSMutableData alloc] initWithData:subData];
+ }
+ else if([str hasSuffix:@"24242D0A"]){
+ NSData *subData = [data subdataWithRange:NSMakeRange(0, data.length - 5)];
+ NSString *str1 = [AiMouseTools dataToHexString:subData];
+ NSLog(@"实收数据 = %@",str1);
+ [self.recvData appendData:subData];
+ NSString *all = [AiMouseTools dataToUtf8String:self.recvData];
+ NSLog(@"完整数据 %@\n %@",[AiMouseTools dataToHexString:self.recvData],all);
+ //结束
+ if(self.didReceiveFullData){
+ self.didReceiveFullData(self.recvData);
+ }
+ }
+ else{
+ //数据
+ NSData *subData = [data subdataWithRange:NSMakeRange(0, data.length - 1)];
+ NSString *str1 = [AiMouseTools dataToHexString:subData];
+ NSLog(@"实收数据 = %@",str1);
+ [self.recvData appendData:data];
+ }
+}
@end
NSString *str = [AiMouseTools dataToUtf8String:data];
NSString *str2 = [AiMouseTools2 fixDeviceData:str];
NSDictionary *dict = [AiMouseTools stringToDictionary:str2];
+
+ if(self.connectType == AiMouseConnectType_hid && dict == nil){
+ [self.frameManager didReceiveHidAuthData:data];
+ return;
+ }
+
if (dict == nil) {
//鼠标移动数据,不处理
return;
}
+
[self showLog:[NSString stringWithFormat:@"fix前 = %@",str]];
[self showLog:[NSString stringWithFormat:@"fix后 = %@",str2]];
if(dict[@"set_config"]){
}
#pragma mark - other
- (void)sendAuthData:(NSData *)data{
- if (self.delegate) {
- [self.delegate aiMouseSendAuthData:data];
+ if(self.connectType == AiMouseConnectType_bluetooth){
+ NSString *str = [AiMouseTools dataToUtf8String:data];
+ NSMutableString *str1 = [NSMutableString stringWithString:str];
+ NSString *sendStr = [NSString stringWithFormat:@"-$$%@$$-\n",str1];
+ NSData *sendData = [sendStr dataUsingEncoding:NSUTF8StringEncoding];
+ [self showLog:[NSString stringWithFormat:@"发送的鉴权数据 = %@",sendStr]];
+
+ if (self.delegate) {
+ [self.delegate aiMouseSendAuthData:sendData];
+ }
+ }
+ else{
+ NSString *str = [AiMouseTools dataToUtf8String:data];
+// NSString *str = @"0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz";
+
+ NSString *sendStr = [NSString stringWithFormat:@"-$$%@$$-",str];
+ NSData *sendData = [sendStr dataUsingEncoding:NSUTF8StringEncoding];
+ [self showLog:[NSString stringWithFormat:@"发送的鉴权数据 = %@",sendStr]];
+
+ NSInteger len = 39;
+ for (NSInteger i = 0; i < sendData.length;i = i+len) {
+ NSData *subData;
+ if (i + len > data.length) {
+ subData = [sendData subdataWithRange:NSMakeRange(i, sendData.length - i)];
+ }
+ else{
+ subData = [sendData subdataWithRange:NSMakeRange(i, len)];
+ }
+ if (self.delegate) {
+ sleep(1);
+ [self.delegate aiMouseSendAuthData:subData];
+ }
+ }
}
}
- (void)sendDeviceInfoData:(NSData *)data{
stopOnStyle = "0">
</BreakpointContent>
</BreakpointProxy>
- <BreakpointProxy
- BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
- <BreakpointContent
- uuid = "0A2B3EE7-9C25-44AC-9ADD-244F3EE1D1DB"
- shouldBeEnabled = "Yes"
- ignoreCount = "0"
- continueAfterRunningActions = "No"
- filePath = "MouseSdk/DeviceManger.m"
- startingColumnNumber = "9223372036854775807"
- endingColumnNumber = "9223372036854775807"
- startingLineNumber = "99"
- endingLineNumber = "99"
- landmarkName = "-bleDidDisconnect:"
- landmarkType = "7">
- </BreakpointContent>
- </BreakpointProxy>
- <BreakpointProxy
- BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
- <BreakpointContent
- uuid = "1C8B736A-006B-4670-9A67-8F24675DD8EB"
- shouldBeEnabled = "Yes"
- ignoreCount = "0"
- continueAfterRunningActions = "No"
- filePath = "MouseSdk/DeviceManger.m"
- startingColumnNumber = "9223372036854775807"
- endingColumnNumber = "9223372036854775807"
- startingLineNumber = "95"
- endingLineNumber = "95"
- landmarkName = "-bleDidConnect:"
- landmarkType = "7">
- </BreakpointContent>
- </BreakpointProxy>
</Breakpoints>
</Bucket>
#pragma mark - CBCentralManagerDelegate
- (void)centralManagerDidUpdateState:(nonnull CBCentralManager *)central {
- [self showLog:[NSString stringWithFormat:@"设å¤\87状态 = %@",@(central.state)]];
+ [self showLog:[NSString stringWithFormat:@"è\93\9dç\89\99状态 = %@",@(central.state)]];
switch (central.state) {
case CBManagerStateUnknown:
/// 获取设备信息
- (void)getDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))completation;
+-(void)startAuthentication;
+
@end
NS_ASSUME_NONNULL_END
if(self.connectStateCallBack)self.connectStateCallBack(AiMouseConnectType_bluetooth,false);
[[AiMouse shared] switchConnect:AiMouseConnectType_hid];
}
+
+-(void)startAuthentication{
+ [self.hid startAuthentication];
+}
@end
/// 获取设备信息
- (void)getDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))completation;
+
+
+-(void)startAuthentication;
@end
NS_ASSUME_NONNULL_END
// PrimaryUsagePage=1 PrimaryUsage=6,鉴权
// PrimaryUsagePage=65283 PrimaryUsage=0,ai
if(PrimaryUsagePage == 1 && PrimaryUsage == 0){
+ //设备信息
[HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
- }
- else if(PrimaryUsagePage == 1 && PrimaryUsage == 6){
+ //鉴权
[HidManager shared].authCha = inIOHIDDeviceRef;
[[HidManager shared] startAuthentication];
}
+ else if(PrimaryUsagePage == 1 && PrimaryUsage == 6){
+// //鉴权
+// [HidManager shared].authCha = inIOHIDDeviceRef;
+// [[HidManager shared] startAuthentication];
+ }
else if(PrimaryUsagePage == 65283 && PrimaryUsage == 0){
+ //ai
[HidManager shared].aiCha = inIOHIDDeviceRef;
}
static void hidReceiveData(void* context, IOReturn result, void* sender, IOHIDReportType type, uint32_t reportID, uint8_t *report,CFIndex reportLength){
NSInteger len = get_data_len(report, reportLength);
NSData *data = [[NSData alloc] initWithBytes:report length:len];
- [[HidManager shared] showLog:[NSString stringWithFormat:@"device = %@ \n [receive] = %@",sender,[AiMouseTools dataToHexString:data]]];
+ [[HidManager shared] showLog:[NSString stringWithFormat:@"[receive] = %@",[AiMouseTools dataToHexString:data]]];
uint32_t PrimaryUsagePage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsagePageKey));
uint32_t PrimaryUsage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsageKey));
[[HidManager shared] showLog:@"device数据"];
[[AiMouse shared] sendDeviceDataToSdk:data];
}
- else if(PrimaryUsagePage == 1 && PrimaryUsage == 6){
- [[HidManager shared] showLog:@"鉴权数据"];
- [[AiMouse shared] sendAuthDataToSdk:data];
- }
else if(PrimaryUsagePage == 65283 && PrimaryUsage == 0){
[[HidManager shared] showLog:@"AI数据"];
[[AiMouse shared] sendAiDataToSdk:data];
}
-(void)sendData:(NSData *)data toDevice:(IOHIDDeviceRef)device{
- [self showLog:[NSString stringWithFormat:@"开始发送 %@\n [send] %@",device,[AiMouseTools dataToHexString:data]]];
+ if(device == nil){
+ [self showLog:@"请先连上设备"];
+ return;
+ }
+ [self showLog:[NSString stringWithFormat:@"开始发送[send] %@\n%@",[AiMouseTools dataToHexString:data],[AiMouseTools dataToUtf8String:data]]];
+
IOReturn ret = IOHIDDeviceSetReport(device, kIOHIDReportTypeOutput, 0, data.bytes, data.length);
if (ret != kIOReturnSuccess) {
- [self showLog:@"发送失败!"];
+ [self showLog:[NSString stringWithFormat:@"发送失败! code = %d",ret]];
}else{
[self showLog:@"发送成功!"];
}
while (buf[url_len] != 0x00) url_len++;
return url_len;
}
+
@end
btn.state = 1;
[self.view addSubview:btn];
}
+ {
+ NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(50, self.view.bounds.size.height - 0, 100, 45)];
+ btn.bordered = true;
+ btn.title = @"鉴权";
+ [btn setTarget:self];
+ [btn setAction:@selector(authAction)];
+ btn.state = 1;
+ [self.view addSubview:btn];
+ }
{
NSTextField *label = [[NSTextField alloc] initWithFrame:CGRectMake(180, self.view.bounds.size.height - 80, 300, 35)];
label.editable = NO;
[ws connectStateDidChange:type connectState:isConnected];
};
}
+
+- (void)authAction{
+ [[DeviceManger shared] startAuthentication];
+}
@end