vmouse添加鉴权
authorliangzhenying <867174124@qq.com>
Tue, 3 Sep 2024 06:13:40 +0000 (14:13 +0800)
committerliangzhenying <867174124@qq.com>
Tue, 3 Sep 2024 06:13:40 +0000 (14:13 +0800)
13 files changed:
MouseSdk/AiMouseSdk/AiMouseSdk.xcodeproj/project.pbxproj
MouseSdk/AiMouseSdk/AiMouseSdk/AiBkzhAuthManager.h [new file with mode: 0644]
MouseSdk/AiMouseSdk/AiMouseSdk/AiBkzhAuthManager.m [new file with mode: 0644]
MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseSdk.m
MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseTools.h
MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseTools.m
MouseSdk/AiMouseSdk/AiMouseSdk/MSUtils.h [new file with mode: 0644]
MouseSdk/AiMouseSdk/AiMouseSdk/MSUtils.m [new file with mode: 0644]
MouseSdk/AiMouseSdk/Manager/DeviceManger.m
MouseSdk/AiMouseSdk/TlwMouseSdk/TlwMouseSdk.m
MouseSdk/MouseSdk.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate
MouseSdk/MouseSdk.xcworkspace/xcuserdata/apple.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
MouseSdk/MouseSdk/ViewController.m

index 08f8089..4191a45 100644 (file)
                1888148F2C85766B009299A9 /* AiDeviceAuthManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1888148C2C85766B009299A9 /* AiDeviceAuthManager.h */; };
                188814902C85766B009299A9 /* AiDeviceAuthManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1888148D2C85766B009299A9 /* AiDeviceAuthManager.m */; };
                188814912C85766B009299A9 /* AiDeviceAuthManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1888148D2C85766B009299A9 /* AiDeviceAuthManager.m */; };
+               188814BD2C85BB76009299A9 /* AiBkzhAuthManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 188814BB2C85BB76009299A9 /* AiBkzhAuthManager.h */; };
+               188814BE2C85BB76009299A9 /* AiBkzhAuthManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 188814BC2C85BB76009299A9 /* AiBkzhAuthManager.m */; };
+               188814C22C85C2BB009299A9 /* MSUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 188814C02C85C2BA009299A9 /* MSUtils.h */; };
+               188814C32C85C2BB009299A9 /* MSUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 188814C02C85C2BA009299A9 /* MSUtils.h */; };
+               188814C42C85C2BB009299A9 /* MSUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 188814C12C85C2BA009299A9 /* MSUtils.m */; };
+               188814C52C85C2BB009299A9 /* MSUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 188814C12C85C2BA009299A9 /* MSUtils.m */; };
                18AD83252BFAE8B9009BDE3B /* AiDeviceInfoManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18AD83232BFAE8B9009BDE3B /* AiDeviceInfoManager.h */; };
                18AD83262BFAE8B9009BDE3B /* AiDeviceInfoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AD83242BFAE8B9009BDE3B /* AiDeviceInfoManager.m */; };
                18AD83292BFB22DE009BDE3B /* AiSender.h in Headers */ = {isa = PBXBuildFile; fileRef = 18AD83272BFB22DE009BDE3B /* AiSender.h */; };
                18862A212C8064E300D3564D /* HidManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HidManager.h; sourceTree = "<group>"; };
                1888148C2C85766B009299A9 /* AiDeviceAuthManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiDeviceAuthManager.h; sourceTree = "<group>"; };
                1888148D2C85766B009299A9 /* AiDeviceAuthManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiDeviceAuthManager.m; sourceTree = "<group>"; };
+               188814BB2C85BB76009299A9 /* AiBkzhAuthManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiBkzhAuthManager.h; sourceTree = "<group>"; };
+               188814BC2C85BB76009299A9 /* AiBkzhAuthManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiBkzhAuthManager.m; sourceTree = "<group>"; };
+               188814C02C85C2BA009299A9 /* MSUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSUtils.h; sourceTree = "<group>"; };
+               188814C12C85C2BA009299A9 /* MSUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSUtils.m; sourceTree = "<group>"; };
                18AD83232BFAE8B9009BDE3B /* AiDeviceInfoManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiDeviceInfoManager.h; sourceTree = "<group>"; };
                18AD83242BFAE8B9009BDE3B /* AiDeviceInfoManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiDeviceInfoManager.m; sourceTree = "<group>"; };
                18AD83272BFB22DE009BDE3B /* AiSender.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiSender.h; sourceTree = "<group>"; };
                                180E7AAB2BD7BB12008558E8 /* AiMouseSdk.m */,
                                180E7B472BD7BD7F008558E8 /* AiAuthManager.h */,
                                180E7B522BD7BD82008558E8 /* AiAuthManager.m */,
+                               188814BB2C85BB76009299A9 /* AiBkzhAuthManager.h */,
+                               188814BC2C85BB76009299A9 /* AiBkzhAuthManager.m */,
                                181CE5BF2C6EED9900EF8D07 /* AiAliAuthManager.h */,
                                181CE5C02C6EED9900EF8D07 /* AiAliAuthManager.m */,
                                18FCA3952C7F2AD100C44A37 /* AiMouseAuth.h */,
                                180E7B4A2BD7BD80008558E8 /* AiMouseTools.m */,
                                180E7B532BD7BD82008558E8 /* AiMouseTools2.h */,
                                180E7B4F2BD7BD81008558E8 /* AiMouseTools2.m */,
+                               188814C02C85C2BA009299A9 /* MSUtils.h */,
+                               188814C12C85C2BA009299A9 /* MSUtils.m */,
                                180E7AB82BD7BD7D008558E8 /* AiRecordManager.h */,
                                180E7B4E2BD7BD81008558E8 /* AiRecordManager.m */,
                        );
                                18862A262C8064E300D3564D /* BleManager.h in Headers */,
                                180E7CC82BD8FC4E008558E8 /* lzo.h in Headers */,
                                180E7C9F2BD8FC4E008558E8 /* xtea.h in Headers */,
+                               188814BD2C85BB76009299A9 /* AiBkzhAuthManager.h in Headers */,
                                180E7C9C2BD8FC4E008558E8 /* lfg.h in Headers */,
                                180E7CAA2BD8FC4E008558E8 /* audio_fifo.h in Headers */,
                                180E7D002BD8FC4F008558E8 /* swresample.h in Headers */,
                                180E7CF22BD8FC4F008558E8 /* d3d11va.h in Headers */,
                                180E7CBC2BD8FC4E008558E8 /* eval.h in Headers */,
                                180E7CF72BD8FC4F008558E8 /* bsf.h in Headers */,
+                               188814C22C85C2BB009299A9 /* MSUtils.h in Headers */,
                                180E7CD22BD8FC4E008558E8 /* ripemd.h in Headers */,
                                18862A2B2C8064E300D3564D /* HidManager.h in Headers */,
                                180E7CD52BD8FC4E008558E8 /* hwcontext_qsv.h in Headers */,
                                18862B212C806BD900D3564D /* version.h in Headers */,
                                18862B222C806BD900D3564D /* base64.h in Headers */,
                                18862B232C806BD900D3564D /* mastering_display_metadata.h in Headers */,
+                               188814C32C85C2BB009299A9 /* MSUtils.h in Headers */,
                                18862B242C806BD900D3564D /* crc.h in Headers */,
                                18862B252C806BD900D3564D /* hwcontext_cuda.h in Headers */,
                                18862B262C806BD900D3564D /* hwcontext_vaapi.h in Headers */,
                                18AD832A2BFB22DE009BDE3B /* AiSender.m in Sources */,
                                184A71202BDD11C70025A332 /* AiTrippleModel.m in Sources */,
                                180E7AAC2BD7BB12008558E8 /* AiMouseSdk.m in Sources */,
+                               188814BE2C85BB76009299A9 /* AiBkzhAuthManager.m in Sources */,
                                188814902C85766B009299A9 /* AiDeviceAuthManager.m in Sources */,
                                184A71072BDA4C050025A332 /* AFHTTPSessionManager.m in Sources */,
                                180E7BE02BD7BD84008558E8 /* AiMouseTools.m in Sources */,
                                18EF7AFB2C7603E800AC5223 /* TlwTools.m in Sources */,
                                18EF7AFA2C7603E800AC5223 /* TlwMouseSdk.m in Sources */,
                                18862A282C8064E300D3564D /* BleManager.m in Sources */,
+                               188814C42C85C2BB009299A9 /* MSUtils.m in Sources */,
                                180E7BDF2BD7BD84008558E8 /* AiMouseConfig.m in Sources */,
                                18EF7AFC2C7603E800AC5223 /* TlwConnectManager.m in Sources */,
                                181CE5C22C6EED9900EF8D07 /* AiAliAuthManager.m in Sources */,
                                18862BC32C806BD900D3564D /* TlwTools.m in Sources */,
                                18862BC42C806BD900D3564D /* TlwMouseSdk.m in Sources */,
                                18862BC52C806BD900D3564D /* BleManager.m in Sources */,
+                               188814C52C85C2BB009299A9 /* MSUtils.m in Sources */,
                                18862BC62C806BD900D3564D /* AiMouseConfig.m in Sources */,
                                18862BC72C806BD900D3564D /* TlwConnectManager.m in Sources */,
                                18862BC82C806BD900D3564D /* AiAliAuthManager.m in Sources */,
diff --git a/MouseSdk/AiMouseSdk/AiMouseSdk/AiBkzhAuthManager.h b/MouseSdk/AiMouseSdk/AiMouseSdk/AiBkzhAuthManager.h
new file mode 100644 (file)
index 0000000..6a5ac80
--- /dev/null
@@ -0,0 +1,24 @@
+//
+//  AiBkzhAuthManager.h
+//  AiMouseManager
+//
+//  Created by incar on 2024/9/2.
+//
+
+
+#import <Foundation/Foundation.h>
+#import "AiMouseSdk.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+typedef void(^AiBkzhCmdFinishBlock)(BOOL isSuccess);
+
+@interface AiBkzhAuthManager : NSObject
+@property (nonatomic,strong)void (^outputLog)(NSString *log);
+@property (nonatomic,strong)void (^setDeviceSecret)(NSString *value,AiBkzhCmdFinishBlock finished);
+@property (nonatomic,strong)void (^authCallBack)(BOOL isSuccess);
+
+- (void)loginWith:(AiMouseDeviceInfo *)info;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/MouseSdk/AiMouseSdk/AiMouseSdk/AiBkzhAuthManager.m b/MouseSdk/AiMouseSdk/AiMouseSdk/AiBkzhAuthManager.m
new file mode 100644 (file)
index 0000000..530cf47
--- /dev/null
@@ -0,0 +1,178 @@
+//
+//  AiBkzhAuthManager.m
+//  AiMouseManager
+//
+//  Created by incar on 2024/9/2.
+//
+
+#import "AiBkzhAuthManager.h"
+#import "AiMouseTools.h"
+#import "AFNetworking.h"
+#import "AiTrippleModel.h"
+#import "AiSecretModel.h"
+
+
+#define kBaseUrl @"http://dmp.raisound.com/bz-api"
+
+#define kProductKey  @"LtKXtGcvk2tAe53uzMKT";
+#define kSecretKey  @"5QYRLYKfitcUaYYUTw4ZVxKPUUVaRyND";
+
+//#define kProductKey  @"4EepovakpbqhZUnUDwH42KAADYGv4UUe";
+//#define kSecretKey  @"5QYRLYKfitcUaYYUTw4ZVxKPUUVaRyND";
+
+//#define kProductKey  @"ccvUoJOLbXn";
+//#define kSecretKey  @"nNRjkRpKTxvprGaW";
+
+
+@interface AiBkzhAuthManager ()
+@property (nonatomic,strong)AiMouseDeviceInfo *deviceInfo;
+@property (nonatomic,strong)NSString *token;
+@end
+@implementation AiBkzhAuthManager
+- (instancetype)init{
+    self = [super init];
+    if (self) {
+
+    }
+    return self;
+}
+
+#pragma mark - pub api
+- (void)loginWith:(AiMouseDeviceInfo *)info{
+
+    self.deviceInfo = info;
+    if (![info valueForKey:@"productKey"] || ![info valueForKey:@"secretKey"] || !info.sn || !info.sn) {
+        [self showLog:@"获取设备信息错误,鉴权失败!"];
+        return;
+    }
+    if([[info valueForKey:@"deviceSecret"] isKindOfClass:[NSString class]] && ([(NSString *)[info valueForKey:@"deviceSecret"] length] > 2)){
+        //已注册过,直接登录
+        [self loginRequest];
+    }
+    else{
+        //未注册
+        [self registerReuest];
+    }
+}
+
+#pragma mark -others
+///将设备密钥密钥写到硬件
+-(void)sendDeviceSecretCmd:(NSString *)deviceSecret{
+    [self.deviceInfo setValue:deviceSecret forKey:@"deviceSecret"];
+    if (self.setDeviceSecret) {
+        self.setDeviceSecret(deviceSecret, ^(BOOL isSuccess) {
+            [self loginRequest];
+        });
+    }
+}
+- (void)showLog:(NSString *)log {
+    if (self.outputLog) self.outputLog([NSString stringWithFormat:@"[auth]%@",log]);
+}
+
+- (void)registerReuest{
+    NSString *productKey = kProductKey;
+    NSString *deviceId =  self.deviceInfo.mac;
+    NSString *timeStamp = [NSString stringWithFormat:@"%ld",(NSInteger)[NSDate date].timeIntervalSince1970*1000];
+    NSString *value =  [NSString stringWithFormat:@"%@%@%@", deviceId,productKey,timeStamp];
+    NSString *signValue = [AiMouseTools stringToHmacSha1:productKey text:value];
+    
+    NSDictionary *params = @{
+        @"pid":productKey,
+        @"deviceId":deviceId,
+        @"signMethod":@"HMACSHA1",
+        @"sign":signValue,
+        @"timeStamp":timeStamp,
+    };
+    
+    [self showLog:[NSString stringWithFormat:@"value %@",value]];
+    [self showLog:[NSString stringWithFormat:@"productKey %@",productKey]];
+    [self showLog:[NSString stringWithFormat:@"signValue %@",signValue]];
+
+    NSString *url = [NSString stringWithFormat:@"%@/dev/auth/active",kBaseUrl];
+    [self showLog:[NSString stringWithFormat:@"%@ %@",url,params]];
+    
+    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
+    manager.responseSerializer =[AFHTTPResponseSerializer serializer];
+    manager.requestSerializer = [AFJSONRequestSerializer serializer];
+
+    AFSecurityPolicy *policy = [AFSecurityPolicy defaultPolicy];
+    policy.allowInvalidCertificates = YES;
+    policy.validatesDomainName = NO;
+    manager.securityPolicy = policy;
+   
+    [manager PUT:url parameters:params headers:@{} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
+        NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
+        [self showLog:[NSString stringWithFormat:@" %@",str]];
+        NSDictionary *dict = [AiMouseTools dataToDictionary:responseObject];
+        NSString *code = dict[@"code"];
+        NSString *deviceSecret = [dict valueForKeyPath:@"data.password"];
+        if(code.integerValue == 20000 && deviceSecret){
+            NSString *nonce = [dict valueForKeyPath:@"data.nonce"];
+            
+//            [self sendDeviceSecretCmd:deviceSecret];
+            [self showLog:@"激活成功"];
+        }
+        else{
+            [self showLog:dict[@"msg"]];
+            if(self.authCallBack)self.authCallBack(false);
+        }
+    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
+        [self showLog:[NSString stringWithFormat:@"error = %@",error]];
+        if(self.authCallBack)self.authCallBack(false);
+    }];
+}
+- (void)loginRequest{
+//    let key = productKey
+//    guard let pwd = try? AESEncyptUtil.encrypt_AES_CBC(encryptText: password, key: key, ivs: nonce) else {
+//        completeHandler(nil,MSError.invalidRequest)
+//        return
+//    }
+    
+    NSString *deviceId = self.deviceInfo.mac;
+    NSString *nonce = [AiMouseTools generateRandomString16];
+    NSString *key = kProductKey;
+    NSString *originPwd = [self.deviceInfo valueForKey:@"deviceSecret"];//注册返回的密码
+    NSString *pwd = originPwd;
+    NSDictionary *params = @{
+        @"deviceId":deviceId,
+        @"password":pwd,
+        @"nonce":nonce,
+};
+    
+    NSString *url = [NSString stringWithFormat:@"%@/dev/auth/sign_in",kBaseUrl];
+    [self showLog:[NSString stringWithFormat:@"%@ %@",url,params]];
+    
+    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
+    manager.responseSerializer =[AFHTTPResponseSerializer serializer];
+    manager.requestSerializer = [AFJSONRequestSerializer serializer];
+    AFSecurityPolicy *policy = [AFSecurityPolicy defaultPolicy];
+    policy.allowInvalidCertificates = YES;
+    policy.validatesDomainName = NO;
+    manager.securityPolicy = policy;
+   
+    [manager POST:url parameters:params headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
+        NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
+        [self showLog:[NSString stringWithFormat:@"%@",str]];
+        NSDictionary *dict = [AiMouseTools dataToDictionary:responseObject];
+        NSString *code = dict[@"code"];
+        NSString *token = [dict valueForKeyPath:@"data.token"];
+        if(code.integerValue == 20001){
+            self.token = token;
+            if(self.authCallBack)self.authCallBack(true);
+            //[self tokenRequest];
+        }
+        else if(code.integerValue == 50020 || code.integerValue == 50021){
+            //设备未激活
+            [self registerReuest];
+        }
+        else{
+            if(self.authCallBack)self.authCallBack(false);
+        }
+    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
+        [self showLog:[NSString stringWithFormat:@"error = %@",error]];
+        if(self.authCallBack)self.authCallBack(false);
+    }];
+}
+
+
+@end
index 7a728d3..1f83a0e 100644 (file)
@@ -6,9 +6,12 @@
 //
 
 #import "AiMouseSdk.h"
-#import "AiDeviceInfoManager.h"
+
 #import "AiAuthManager.h"
 #import "AiAliAuthManager.h"
+#import "AiBkzhAuthManager.h"
+
+#import "AiDeviceInfoManager.h"
 #import "AiAudioManager.h"
 #import "AiMouseTools.h"
 #import "AiMouseTools2.h"
 
 @interface AiMouse()
 @property (nonatomic, assign) AiMouseLogLevel logLevel;
+
 @property (nonatomic, strong) AiAuthManager *authManager;
 @property (nonatomic, strong) AiAliAuthManager *aliAuthManager;
+@property (nonatomic, strong) AiBkzhAuthManager *bkAuthManager;
+
 @property (nonatomic, strong) AiAudioManager *audioManager;
 @property (nonatomic, strong) AiRecordManager *recordManager;
 @property (nonatomic, strong) void (^authBlock)(AiMouseAuthState state);
     }
     return _aliAuthManager;
 }
+-(AiBkzhAuthManager *)bkAuthManager{
+    if (!_bkAuthManager) {
+        _bkAuthManager = [[AiBkzhAuthManager alloc] init];
+        __weak typeof(self) ws = self;
+        _bkAuthManager.outputLog = ^(NSString * _Nonnull log) {
+            [ws showLog:log];
+        };
+        _bkAuthManager.setDeviceSecret = ^(NSString * _Nonnull value, AiBkzhCmdFinishBlock  _Nonnull finished) {
+            [ws setDeviceSecret:value completation:finished];
+        };
+        _bkAuthManager.authCallBack = ^(BOOL isSuccess) {
+            [ws authResult:isSuccess];
+        };
+    }
+    return _bkAuthManager;
+}
 
 -(AiAudioManager *)audioManager{
     if (!_audioManager) {
                 [ws.aliAuthManager loginWith:deviceInfo];
             }
             else if(type == AiMouseAuthType_BeiKeZhiHui){
-                [ws.authManager loginWith:deviceInfo];
+                [ws.bkAuthManager loginWith:deviceInfo];
             }
             else{
                 [ws.authManager loginWith:deviceInfo];
     }
     self.isAuthing = true;
     __weak typeof(self) ws = self;
-    [self startAuthentication:AiMouseAuthType_Ali finished:^(AiMouseAuthState state) {
+    [self startAuthentication:AiMouseAuthType_none finished:^(AiMouseAuthState state) {
         ws.isAuthing = false;
         [ws showLog:state == AiMouseAuthState_Success? @"鉴权成功":@"鉴权失败"];
         if(ws.delegate) [ws.delegate aiMouseAuthenticationResult:state];
index 1b2929d..813347e 100644 (file)
@@ -39,6 +39,8 @@ NS_ASSUME_NONNULL_BEGIN
 +(NSString *)randomString:(NSInteger)length;
 
 +(NSString *)getCurrentTime;
+
++ (NSString *)generateRandomString16;
 @end
 
 NS_ASSUME_NONNULL_END
index 1c6134a..1b2482e 100644 (file)
     return hash;
 }
 
+
 + (NSString *)MD5ForUpper32:(NSString *)str {
     const char* input = [str UTF8String];
     unsigned char result[CC_MD5_DIGEST_LENGTH];
     return  text2;
 }
 
+
++ (NSString *)generateRandomString16 {
+    NSInteger length = 16;
+    NSString *letters = @"abcdef0123456789";
+    NSMutableString *randomString = [[NSMutableString alloc] init];
+    for (NSInteger i = 0; i < length; i++) {
+        NSInteger randomValue = arc4random_uniform((u_int32_t)letters.length);
+        [randomString appendString:[letters substringWithRange:NSMakeRange(randomValue, 1)]];
+    }
+    return randomString;
+}
 @end
 
diff --git a/MouseSdk/AiMouseSdk/AiMouseSdk/MSUtils.h b/MouseSdk/AiMouseSdk/AiMouseSdk/MSUtils.h
new file mode 100644 (file)
index 0000000..8455a2c
--- /dev/null
@@ -0,0 +1,40 @@
+////
+////  AiMouseTools.h
+////  AiMouse
+////
+////  Created by incar on 2024/2/28.
+////
+//
+//#import <Foundation/Foundation.h>
+//
+//NS_ASSUME_NONNULL_BEGIN
+//
+//@interface MSUtils : NSObject
+//+ (NSArray *)stringToArray:(NSString *)jsonString;
+//+ (NSString *)arrayToString:(NSArray *)arr;
+//
+//+ (NSDictionary *)stringToDictionary:(NSString *)jsonString;
+//+ (NSString *)dictionaryToString:(NSDictionary *)dic;
+//
+//+ (NSDictionary *)dataToDictionary:(NSData *)jsonData;
+//+ (NSData *)dictionaryToData:(NSDictionary *)dicJson;
+//
+//
+//+ (NSString *)dataToHexString:(NSData *)data;
+//
+//+ (NSString *)dataToHexString_placeholder:(NSData *)data;
+//
+//+ (NSData *)hexStringToData:(NSString *)hexStr ;
+//
+//+ (NSString *)dataToUtf8String:(NSData *)data;
+//
+//+ (NSString *)stringTomd5:(NSString *)str;
+//
+//+ (NSString *)stringToHmacSha1:(NSString*)key text:(NSString*)text;
+//
+//+ (NSString *)MD5ForUpper32:(NSString *)str;
+//
+//+ (NSData *)dataWithHexString:(NSString *)hexStr;
+//@end
+//
+//NS_ASSUME_NONNULL_END
diff --git a/MouseSdk/AiMouseSdk/AiMouseSdk/MSUtils.m b/MouseSdk/AiMouseSdk/AiMouseSdk/MSUtils.m
new file mode 100644 (file)
index 0000000..22fa5b9
--- /dev/null
@@ -0,0 +1,190 @@
+////
+////  AiMouseTools.m
+////  AiMouse
+////
+////  Created by incar on 2024/2/28.
+////
+//
+//#import "MSUtils.h"
+//#import <CommonCrypto/CommonCryptor.h>
+//#include <CommonCrypto/CommonDigest.h>
+//#include <CommonCrypto/CommonHMAC.h>
+//
+//@implementation MSUtils
+//+ (NSArray *)stringToArray:(NSString *)jsonString{
+//    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
+//    NSError *error;
+//    NSArray *arr = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
+//    return arr;
+//}
+//+ (NSString *)arrayToString:(NSArray *)arr{
+//    NSError *error;
+//    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:&error];
+//    NSString * string = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+//    return  string;
+//}
+//+ (NSDictionary *)stringToDictionary:(NSString *)jsonString{
+//    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
+//    if (jsonData == nil) {
+//        return nil;
+//    }
+//    NSError *error;
+//    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
+//    return dict;
+//}
+//+ (NSString *)dictionaryToString:(NSDictionary *)dic{
+//    if ([dic isKindOfClass:[NSDictionary class]]) {
+//        NSError *error;
+//        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error];
+//        NSString * string = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+//        return  string;
+//    }
+//    else{
+//        return @"";
+//    }
+//}
+//
+//+ (NSDictionary *)dataToDictionary:(NSData *)jsonData{
+//    if (![jsonData isKindOfClass:[NSData class]] || jsonData.length < 1) {
+//        return nil;
+//    }
+//    id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
+//    if (![jsonObj isKindOfClass:[NSDictionary class]]) {
+//        return nil;
+//    }
+//    return [NSDictionary dictionaryWithDictionary:(NSDictionary *)jsonObj];
+//}
+//
+//
+//+ (NSData *)dictionaryToData:(NSDictionary *)dicJson{
+//    if (![dicJson isKindOfClass:[NSDictionary class]]) {
+//        return nil;
+//    }
+//    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dicJson options:0 error:nil];
+//    if (![jsonData isKindOfClass:[NSData class]]) {
+//        return nil;
+//    }
+//    return jsonData;
+//}
+//
+//+ (NSString *)dataToHexString:(NSData *)data {
+//    NSUInteger length = data.length;
+//    NSMutableString *result = [NSMutableString stringWithCapacity:length * 2];
+//    const unsigned char *byte = data.bytes;
+//    for (int i = 0; i < length; i++, byte++) {
+//        [result appendFormat:@"%02X", *byte];
+//    }
+//    return result;
+//}
+//
+//+ (NSString *)dataToHexString_placeholder:(NSData *)data {
+//    NSUInteger length = data.length;
+//    NSString *placeholder = @" ";
+//    NSMutableString *result = [NSMutableString stringWithCapacity:length * 2];
+//    const unsigned char *byte = data.bytes;
+//    for (int i = 0; i < length; i++, byte++) {
+//        [result appendFormat:@"%02X%@", *byte, placeholder];
+//    }
+//    return result;
+//}
+//
+//+ (NSData *)hexStringToData:(NSString *)hexStr {
+//    hexStr = [hexStr stringByReplacingOccurrencesOfString:@" " withString:@""];
+//    hexStr = [hexStr lowercaseString];
+//    NSUInteger len = hexStr.length;
+//    if (!len) return nil;
+//    unichar *buf = malloc(sizeof(unichar) * len);
+//    if (!buf) return nil;
+//    [hexStr getCharacters:buf range:NSMakeRange(0, len)];
+//    
+//    NSMutableData *result = [NSMutableData data];
+//    unsigned char bytes;
+//    char str[3] = { '\0', '\0', '\0' };
+//    int i;
+//    for (i = 0; i < len / 2; i++) {
+//        str[0] = buf[i * 2];
+//        str[1] = buf[i * 2 + 1];
+//        bytes = strtol(str, NULL, 16);
+//        [result appendBytes:&bytes length:1];
+//    }
+//    free(buf);
+//    return result;
+//}
+//
+//+ (NSString *)dataToUtf8String:(NSData *)data {
+//    if (data.length > 0) {
+//        return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+//    }
+//    return @"";
+//}
+//
+//
+//+ (NSString *)stringTomd5:(NSString *)str {
+//    if (str.length == 0) {
+//        return nil;
+//    }
+//    // 初始化C字符数组
+//    const char* original_str = (const char *)[[str dataUsingEncoding:NSUTF8StringEncoding] bytes];
+//    // 盛放数字校验的字符数组(长度为16bytes)
+//    unsigned char digist[CC_MD5_DIGEST_LENGTH]; //CC_MD5_DIGEST_LENGTH = 16
+//    CC_MD5(original_str, (uint)strlen(original_str), digist);
+//    //        NSMutableString* outPutStr = [NSMutableString stringWithCapacity:10];
+//    NSMutableString* outPutStr = [NSMutableString new];
+//    for(int  i =0; i<CC_MD5_DIGEST_LENGTH;i++){
+//        [outPutStr appendFormat:@"%02X",digist[i]];//小写x表示输出的是小写MD5,大写X表示输出的是大写MD5
+//    }
+//    return outPutStr;
+//}
+//
+////HmacSHA1加密
+//+ (NSString *)stringToHmacSha1:(NSString*)key text:(NSString*)text{
+//    const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];
+//    const char *cData = [text cStringUsingEncoding:NSUTF8StringEncoding];
+//    uint8_t cHMAC[CC_SHA1_DIGEST_LENGTH];
+//    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
+//    //NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:CC_SHA1_DIGEST_LENGTH];
+//    NSString *hash;
+//    NSMutableString * output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
+//    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
+//        [output appendFormat:@"%02X", cHMAC[i]];
+//    hash = output;
+//    return hash;
+//}
+//
+//+ (NSString *)MD5ForUpper32:(NSString *)str {
+//    const char* input = [str UTF8String];
+//    unsigned char result[CC_MD5_DIGEST_LENGTH];
+//    CC_MD5(input, (CC_LONG)strlen(input), result);
+//    // 'CC_MD5' is deprecated: first deprecated in iOS 13.0 - This function is cryptographically broken and should not be used in security contexts. Clients should migrate to SHA256 (or stronger).
+//    NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
+//    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
+//        [digest appendFormat:@"%02X", result[i]];
+//    }
+//    
+//    return digest;
+//}
+//
+//+ (NSData *)dataWithHexString:(NSString *)hexStr {
+//    hexStr = [hexStr stringByReplacingOccurrencesOfString:@" " withString:@""];
+//    hexStr = [hexStr lowercaseString];
+//    NSUInteger len = hexStr.length;
+//    if (!len) return nil;
+//    unichar *buf = malloc(sizeof(unichar) * len);
+//    if (!buf) return nil;
+//    [hexStr getCharacters:buf range:NSMakeRange(0, len)];
+//    
+//    NSMutableData *result = [NSMutableData data];
+//    unsigned char bytes;
+//    char str[3] = { '\0', '\0', '\0' };
+//    int i;
+//    for (i = 0; i < len / 2; i++) {
+//        str[0] = buf[i * 2];
+//        str[1] = buf[i * 2 + 1];
+//        bytes = strtol(str, NULL, 16);
+//        [result appendBytes:&bytes length:1];
+//    }
+//    free(buf);
+//    return result;
+//}
+//@end
+//
index 6c4cbe1..39aada2 100644 (file)
 /// 鉴权结果返回
 /// - Parameter authState: 鉴权状态
 - (void)aiMouseAuthenticationResult:(AiMouseAuthState)authState{
-    if(self.authCallBack )self.authCallBack(AiMouseAuthState_Success == true);
+    if(self.authCallBack )self.authCallBack(AiMouseAuthState_Success == authState);
 }
 
 /// 设备信息数据回调,需要将此数据通过设备信息特征转发给蓝牙设备
     if (self.aiMouseAddLogCallBack) {
         self.aiMouseAddLogCallBack(log);
     }
-    NSLog(@"[AiMouseSdk] %@",log);
+    NSLog(@"[AiMouseSdk]%@",log);
 }
 
 - (void)finishRecored:(NSData *)data{
index 516c58c..c7a8526 100644 (file)
                 }
                 else{
                     if(ws.getFullInfoCallBack)ws.getFullInfoCallBack(nil,error);
+                    ws.getFullInfoCallBack = nil;
                 }
             }];
         }
         else{
             if(ws.getFullInfoCallBack) ws.getFullInfoCallBack(nil,error);
+            ws.getFullInfoCallBack = nil;
         }
     }];
     
             NSString *code = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(3, 2)] encoding:NSUTF8StringEncoding];
             NSString *brand = [self getBrand:[data subdataWithRange:NSMakeRange(5, 6)]];
             NSString *batch = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(11, 2)] encoding:NSUTF8StringEncoding];
-            NSString *mac = [TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(13, 6)]];
+            NSString *mac = [[TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(13, 6)]] lowercaseString];
             
             NSString *fullBrand =  [self getFullBrand:[data subdataWithRange:NSMakeRange(5, 6)]];
-            NSString *sn = [[NSString stringWithFormat:@"%@%@%@%@",code,fullBrand,batch,mac] lowercaseString];
+            NSString *sn = [NSString stringWithFormat:@"%@%@%@%@",code,fullBrand,batch,mac];
             TlwSnInfo *info = [[TlwSnInfo alloc] init];
             info.code = code;
             info.brand = brand;
             NSString *code = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(3, 2)] encoding:NSUTF8StringEncoding];
             NSString *brand = [self getBrand:[data subdataWithRange:NSMakeRange(5, 6)]];
             NSString *batch = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(11, 2)] encoding:NSUTF8StringEncoding];
-            NSString *mac = [TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(13, 6)]];
+            NSString *mac = [[TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(13, 6)]] lowercaseString];
             
             NSString *fullBrand =  [self getFullBrand:[data subdataWithRange:NSMakeRange(5, 6)]];
-            NSString *sn = [[NSString stringWithFormat:@"%@%@%@%@",code,fullBrand,batch,mac] lowercaseString];
+            NSString *sn = [NSString stringWithFormat:@"%@%@%@%@",code,fullBrand,batch,mac] ;
             TlwSnInfo *info = [[TlwSnInfo alloc] init];
             info.code = code;
             info.brand = brand;
 
 - (void)showLog:(NSString *)log{
     if (self.delegate && [self.delegate respondsToSelector:@selector(tlwMouseAddLog:)]) {
-        [self.delegate tlwMouseAddLog:[NSString stringWithFormat:@"[tlw] %@",log]];
+        [self.delegate tlwMouseAddLog:[NSString stringWithFormat:@"[tlw]%@",log]];
     }
     //    if(self.logLevel == TlwMouseLogLevel_info){
     //        NSLog(@"[tlw]%@",log);
index 6354bcb..31d80b2 100644 (file)
Binary files a/MouseSdk/MouseSdk.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate and b/MouseSdk/MouseSdk.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate differ
index 5a027d4..c3ddbcd 100644 (file)
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "31993B35-9DA9-4381-B863-11397B6D9184"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "AiMouseSdk/TlwMouseSdk/TlwMouseSdk.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "22"
-            endingLineNumber = "22"
-            landmarkName = "-description"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "B9B9032E-D4BF-479C-B350-7D0E383A7C18"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "AiMouseSdk/TlwMouseSdk/TlwMouseSdk.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "656"
-            endingLineNumber = "656"
-            landmarkName = "-getFullBrand:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
    </Breakpoints>
 </Bucket>
index 8824172..24cecc0 100644 (file)
@@ -1,76 +1,3 @@
-//
-//  ViewController.m
-//  MouseSdk
-//
-//  Created by incar on 2024/2/18.
-//
-
-//#import "ViewController.h"
-//#import "FrkVC.h"
-//#import "TlwVC.h"
-//#import "ScanVC.h"
-//#import "TlwHidManager.h"
-//#import "HidManager.h"
-//@interface ViewController ()
-//@end
-//
-//@implementation ViewController
-//
-//- (void)viewDidLoad {
-//    [super viewDidLoad];
-//    
-//    // Do any additional setup after loading the view.
-//    [self setupUI];
-//}
-//
-//- (void)setRepresentedObject:(id)representedObject {
-//    [super setRepresentedObject:representedObject];
-//    
-//    // Update the view, if already loaded.
-//}
-//
-//- (void)setupUI{
-//    self.title = @"AI SDK";
-//    {
-//        NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(50, self.view.bounds.size.height - 80, 100, 45)];
-//        btn.bordered = true;
-//        btn.title = @"富瑞坤";
-//        [btn setTarget:self];
-//        [btn setAction:@selector(frkAction)];
-//        btn.state = 1;
-//        [self.view addSubview:btn];
-//    }
-//    {
-//        NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(50, self.view.bounds.size.height - 200, 100, 45)];
-//        btn.bordered = true;
-//        btn.title = @"泰凌微";
-//        [btn setTarget:self];
-//        [btn setAction:@selector(tlwAction)];
-//        btn.state = 1;
-//        [self.view addSubview:btn];
-//    }
-//}
-//
-//#pragma mark - action
-//- (void)frkAction{
-//    [HidManager shared];
-//    FrkVC *vc = [[FrkVC alloc] initWithNibName:nil bundle:nil];
-//    [self presentViewControllerAsModalWindow:vc];
-//}
-//- (void)tlwAction{
-////    [TlwHidManager shared];
-////    return;
-//    TlwVC *vc = [[TlwVC alloc] initWithNibName:nil bundle:nil];
-//    [self presentViewControllerAsModalWindow:vc];
-//    
-//}
-//@end
-//
-//  FrkVC.m
-//  MouseSdk
-//
-//  Created by incar on 2024/8/21.
-//
 
 #import "ViewController.h"
 #import "ScanVC.h"
     [self.view addSubview:backgroundView];
     
     self.title = @"AI SDK";
-//    {
-//        NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(50, self.view.bounds.size.height - 80, 100, 45)];
-//        btn.bordered = true;
-//        btn.title = @"蓝牙扫描";
-//        [btn setTarget:self];
-//        [btn setAction:@selector(scanAction)];
-//        btn.state = 1;
-//        [self.view addSubview:btn];
-//    }
-//    {
-//        NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(50, self.view.bounds.size.height - 100, 100, 45)];
-//        btn.bordered = true;
-//        btn.title = @"获取设备信息";
-//        [btn setTarget:self];
-//        [btn setAction:@selector(geviceInfoAction)];
-//        btn.state = 1;
-//        [self.view addSubview:btn];
-//    }
     {
         NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(50, self.view.bounds.size.height - 200, 100, 45)];
         btn.bordered = true;