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 */,
--- /dev/null
+//
+// 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
--- /dev/null
+//
+// 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
//
#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];
+(NSString *)randomString:(NSInteger)length;
+(NSString *)getCurrentTime;
+
++ (NSString *)generateRandomString16;
@end
NS_ASSUME_NONNULL_END
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
--- /dev/null
+////
+//// 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
--- /dev/null
+////
+//// 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
+//
/// 鉴权结果返回
/// - 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{
}
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);
</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>
-//
-// 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;