bleManger支持多名称搜索
authorliangzhenying <867174124@qq.com>
Wed, 28 Aug 2024 08:36:44 +0000 (16:36 +0800)
committerliangzhenying <867174124@qq.com>
Wed, 28 Aug 2024 08:36:44 +0000 (16:36 +0800)
MouseSdk/AiMouseSdk/TlwMouseSdk/TlwMouseSdk.h
MouseSdk/AiMouseSdk/TlwMouseSdk/TlwMouseSdk.m
MouseSdk/MouseSdk.xcodeproj/project.pbxproj
MouseSdk/MouseSdk.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate
MouseSdk/MouseSdk.xcworkspace/xcuserdata/apple.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
MouseSdk/MouseSdk/Ble/BleManager.h
MouseSdk/MouseSdk/Ble/BleManager.m
MouseSdk/MouseSdk/Ble/DeviceManger.h
MouseSdk/MouseSdk/Ble/DeviceManger.m
MouseSdk/MouseSdk/ScanVC.m
MouseSdk/MouseSdk/TlwScanVC.m

index 6800dc3..3f513e6 100644 (file)
@@ -49,7 +49,7 @@ typedef NS_ENUM(NSInteger,TlwMouseLogLevel) {
 @optional
 /// 输出sdk日志
 /// - Parameter log: 日志
-- (void)aiMouseAddLog:(NSString *)log;
+- (void)tlwMouseAddLog:(NSString *)log;
 
 @end
 
@@ -57,9 +57,9 @@ typedef NS_ENUM(NSInteger,TlwMouseLogLevel) {
 @property (nonatomic, weak) id<TlwMouseDelegate> delegate;/// 代理
 @property (nonatomic, readonly) AiMouseConnectType connectType;//连接类型
 @property (nonatomic, readonly) BOOL connected;//是否已连接
-
-/// 单利
-+(TlwMouse *)shared;
+//
+///// 单利
+//+(TlwMouse *)shared;
 
 /// 设置日志等级
 /// - Parameter level: 等级
index 04716c4..c8dd4b1 100644 (file)
 @end
 
 @implementation TlwMouse
-+(TlwMouse *)shared{
-    static TlwMouse *manager = nil;
-    static dispatch_once_t oncePredicate;
-    dispatch_once(&oncePredicate, ^{
-        manager = [[TlwMouse alloc]init];
-    });
-    return manager;
-}
+//+(TlwMouse *)shared{
+//    static TlwMouse *manager = nil;
+//    static dispatch_once_t oncePredicate;
+//    dispatch_once(&oncePredicate, ^{
+//        manager = [[TlwMouse alloc]init];
+//    });
+//    return manager;
+//}
 
 -(instancetype)init{
     if (self = [super init]) {
 }
 
 - (void)showLog:(NSString *)log{
-    if (self.delegate && [self.delegate respondsToSelector:@selector(aiMouseAddLog:)]) {
-        [self.delegate aiMouseAddLog:[NSString stringWithFormat:@"[AiMouseSdk]%@",log]];
+    if (self.delegate && [self.delegate respondsToSelector:@selector(tlwMouseAddLog:)]) {
+        [self.delegate tlwMouseAddLog:[NSString stringWithFormat:@"[AiMouseSdk]%@",log]];
     }
     if(self.logLevel == TlwMouseLogLevel_info){
         NSLog(@"[AiMouseSdk]%@",log);
index 0eff9b0..e5230b5 100644 (file)
@@ -31,9 +31,6 @@
                18CC59962C787AAB0009FCC8 /* DeviceManager2.m in Sources */ = {isa = PBXBuildFile; fileRef = 18CC59952C787AAB0009FCC8 /* DeviceManager2.m */; };
                18EF7B0D2C76079E00AC5223 /* TlwVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7B0C2C76079E00AC5223 /* TlwVC.m */; };
                18EF7B102C7607C100AC5223 /* FrkVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7B0F2C7607C100AC5223 /* FrkVC.m */; };
-               18EF7B172C760A5B00AC5223 /* TlwBleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7B122C760A5A00AC5223 /* TlwBleManager.m */; };
-               18EF7B182C760A5B00AC5223 /* TlwHidManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7B132C760A5A00AC5223 /* TlwHidManager.m */; };
-               18EF7B192C760A5B00AC5223 /* TlwDeviceManger.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7B162C760A5A00AC5223 /* TlwDeviceManger.m */; };
                18EF7B1D2C760FF700AC5223 /* TlwScanVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7B1B2C760FF700AC5223 /* TlwScanVC.m */; };
                18EF7B1E2C760FF700AC5223 /* TlwScanVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 18EF7B1C2C760FF700AC5223 /* TlwScanVC.xib */; };
                18F3235D2B8ED78300CABA2E /* ScanCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F3235C2B8ED78300CABA2E /* ScanCell.m */; };
                18EF7B0C2C76079E00AC5223 /* TlwVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TlwVC.m; sourceTree = "<group>"; };
                18EF7B0E2C7607C100AC5223 /* FrkVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FrkVC.h; sourceTree = "<group>"; };
                18EF7B0F2C7607C100AC5223 /* FrkVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FrkVC.m; sourceTree = "<group>"; };
-               18EF7B112C760A5A00AC5223 /* TlwHidManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TlwHidManager.h; sourceTree = "<group>"; };
-               18EF7B122C760A5A00AC5223 /* TlwBleManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TlwBleManager.m; sourceTree = "<group>"; };
-               18EF7B132C760A5A00AC5223 /* TlwHidManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TlwHidManager.m; sourceTree = "<group>"; };
-               18EF7B142C760A5A00AC5223 /* TlwDeviceManger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TlwDeviceManger.h; sourceTree = "<group>"; };
-               18EF7B152C760A5A00AC5223 /* TlwBleManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TlwBleManager.h; sourceTree = "<group>"; };
-               18EF7B162C760A5A00AC5223 /* TlwDeviceManger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TlwDeviceManger.m; sourceTree = "<group>"; };
                18EF7B1A2C760FF700AC5223 /* TlwScanVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TlwScanVC.h; sourceTree = "<group>"; };
                18EF7B1B2C760FF700AC5223 /* TlwScanVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TlwScanVC.m; sourceTree = "<group>"; };
                18EF7B1C2C760FF700AC5223 /* TlwScanVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TlwScanVC.xib; sourceTree = "<group>"; };
                        isa = PBXGroup;
                        children = (
                                18EF7B072C7604BF00AC5223 /* Ble */,
-                               18EF7B062C7604AA00AC5223 /* Tlw */,
                                18C31D6F2BBAA6CC0089D656 /* Info.plist */,
                                181F976C2C7C6E10002FCF68 /* AiHidManager.h */,
                                181F976B2C7C6E10002FCF68 /* AiHidManager.m */,
                        path = MouseSdkUITests;
                        sourceTree = "<group>";
                };
-               18EF7B062C7604AA00AC5223 /* Tlw */ = {
-                       isa = PBXGroup;
-                       children = (
-                               18EF7B142C760A5A00AC5223 /* TlwDeviceManger.h */,
-                               18EF7B162C760A5A00AC5223 /* TlwDeviceManger.m */,
-                               18EF7B152C760A5A00AC5223 /* TlwBleManager.h */,
-                               18EF7B122C760A5A00AC5223 /* TlwBleManager.m */,
-                               18EF7B112C760A5A00AC5223 /* TlwHidManager.h */,
-                               18EF7B132C760A5A00AC5223 /* TlwHidManager.m */,
-                       );
-                       path = Tlw;
-                       sourceTree = "<group>";
-               };
                18EF7B072C7604BF00AC5223 /* Ble */ = {
                        isa = PBXGroup;
                        children = (
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
-                               18EF7B192C760A5B00AC5223 /* TlwDeviceManger.m in Sources */,
                                18F3235D2B8ED78300CABA2E /* ScanCell.m in Sources */,
                                18BF1DD22B81AB7C00B8D90F /* ViewController.m in Sources */,
                                181F976D2C7C6E11002FCF68 /* AiHidManager.m in Sources */,
                                18BF1DD92B81AB7F00B8D90F /* main.m in Sources */,
-                               18EF7B172C760A5B00AC5223 /* TlwBleManager.m in Sources */,
                                185EBE042C79D16600B2503B /* TimerManager.m in Sources */,
                                18F328D52B98569D00CABA2E /* Config.m in Sources */,
-                               18EF7B182C760A5B00AC5223 /* TlwHidManager.m in Sources */,
                                18EF7B0D2C76079E00AC5223 /* TlwVC.m in Sources */,
                                18CC59962C787AAB0009FCC8 /* DeviceManager2.m in Sources */,
                                182B548D2BB7EC9B009F53B6 /* DeviceManger.m in Sources */,
index f9860c2..2c419f2 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 05a7ad8..79285a3 100644 (file)
             filePath = "MouseSdk/Ble/DeviceManger.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "251"
-            endingLineNumber = "251"
+            startingLineNumber = "266"
+            endingLineNumber = "266"
             landmarkName = "-tlwMouseSendDeviceInfoData:"
             landmarkType = "7">
          </BreakpointContent>
index 171cae5..b233c5b 100644 (file)
 @property (nonatomic, copy)void (^receiveVoiceDataCallBack)(NSData *data);/// 语音数据回调
 @property (nonatomic, copy)void (^receiveInfoDataCallBack)(NSData *data);/// 设备信息数据回调
 @property (nonatomic, copy)void (^logCallBack)(NSString *log);//输出日志
-/// 单利
-+(BleManager *)shared;
+@property (nonatomic, copy) NSArray *bleList;
 
-// bleName:蓝牙设备名称
-- (void)startScanWithName:(NSString *)bleName;
+///// 单利
+//+(BleManager *)shared;
+
+// bleList:蓝牙设备名称
+- (void)startScanWithName:(NSArray *)bleList;
 
 //停止扫描
 - (void)stopScan;
index be15414..7173e43 100644 (file)
 @property(nonatomic, strong) CBPeripheral *crrentPeripheral;//连接的设备
 @property(nonatomic, strong) CBCharacteristic *deviceInfoCha;//设备信息特征
 @property (nonatomic,strong) NSMutableData *recordData;//录音的数据
-@property (nonatomic, copy) NSString *targetBleName;
+
 @end
 
 @implementation BleManager
-+(BleManager *)shared{
-    static BleManager *manager = nil;
-    static dispatch_once_t oncePredicate;
-    dispatch_once(&oncePredicate, ^{
-        manager = [[BleManager alloc]init];
-    });
-    return manager;
-}
+//+(BleManager *)shared{
+//    static BleManager *manager = nil;
+//    static dispatch_once_t oncePredicate;
+//    dispatch_once(&oncePredicate, ^{
+//        manager = [[BleManager alloc]init];
+//    });
+//    return manager;
+//}
 
 - (instancetype)init{
     self = [super init];
 }
 
 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
-    if (self.targetBleName != nil && self.targetBleName.length > 0 && [self.targetBleName isEqualToString:peripheral.name]) {
+    if ([self isContainInSearchList:peripheral.name]) {
         [self connectPeripheral:peripheral];
     }
 }
 
 - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
-    [self showLog:[NSString stringWithFormat:@"didConnectPeripheral:连接成功 name = %@",peripheral.name]];
+    [self showLog:[NSString stringWithFormat:@"连接成功 name = %@",peripheral.name]];
     peripheral.delegate = self;
     [peripheral discoverServices:nil];
     self.crrentPeripheral = peripheral;
 }
 
 -(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
-    [self showLog:[NSString stringWithFormat:@"didDisconnectPeripheral:断开连接。。。%@",error.description]];
+    [self showLog:[NSString stringWithFormat:@"断开连接。。。%@",error.description]];
     self.crrentPeripheral = nil;
     self.connectStateCallBack(false);
 }
 - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error{
-    [self showLog:[NSString stringWithFormat:@"didFailToConnectPeripheral:连接失败。。。%@",error.description]];
+    [self showLog:[NSString stringWithFormat:@"连接失败。。。%@",error.description]];
     self.crrentPeripheral = nil;
     self.connectStateCallBack(false);
 }
 #pragma mark - CBPeripheralDelegate
 //发现服务
 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
-    [self showLog:[NSString stringWithFormat:@"didDiscoverServices:发现服务"]];
+    [self showLog:[NSString stringWithFormat:@"发现服务"]];
     for (CBService *service in peripheral.services){
         [peripheral discoverCharacteristics:nil forService:service];
     }
         else if ([characteristic.UUID.UUIDString isEqualToString:kSetDeviceInfoUUID]) {
             //设备信息特征
             self.deviceInfoCha = characteristic;
-            [self showLog:(@"didDiscoverCharacteristicsForService:回调连接成功 ")];
+            [self showLog:(@"回调连接成功 ")];
             self.connectStateCallBack(true);
         }
     }
 }
 
 #pragma mark - public
-- (void)startScanWithName:(NSString *)bleName {
+- (void)startScanWithName:(NSArray *)bleList{
+    self.bleList = bleList;
     //如果是已连接或者正在连接,不需要在链接了
-    if (self.crrentPeripheral != nil ) {
-        if ([self.crrentPeripheral.name isEqualToString:bleName]) {
-            if (self.crrentPeripheral.state == CBPeripheralStateConnected || self.crrentPeripheral.state == CBPeripheralStateConnecting) {
-                return;
-            }
-        }
-        else {
-            [self.centralManager cancelPeripheralConnection:self.crrentPeripheral];
-        }
-    }
-    
-    self.targetBleName = bleName;
+//    if (self.crrentPeripheral != nil ) {
+//        if ([self.crrentPeripheral.name isEqualToString:bleName]) {
+//            if (self.crrentPeripheral.state == CBPeripheralStateConnected || self.crrentPeripheral.state == CBPeripheralStateConnecting) {
+//                return;
+//            }
+//        }
+//        else {
+//            [self.centralManager cancelPeripheralConnection:self.crrentPeripheral];
+//        }
+//    }
+//    
+//    self.bleName = bleName;
 
     NSArray<CBPeripheral *> *devices = [self.centralManager retrieveConnectedPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]]];
-    if (devices.count > 0 && [devices[0].name isEqualToString:bleName]) {
-        [self showLog:[NSString stringWithFormat:@"autoConnectDevice:匹配过的设备%@",devices[0].name]];
+    if (devices.count > 0 && [self isContainInSearchList: devices[0].name]) {
+        [self showLog:[NSString stringWithFormat:@"匹配过的设备%@",devices[0].name]];
         [self connectPeripheral:devices[0]];
     }
     else{
-        [self showLog:[NSString stringWithFormat:@"开始扫描 设备名称 %@",bleName]];
+        [self showLog:[NSString stringWithFormat:@"开始扫描 设备名称 %@",bleList]];
         [self.centralManager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey : [NSNumber numberWithBool:NO]}];
     }
 }
 
+- (BOOL)isContainInSearchList:(NSString *)name{
+    for (NSString *item in self.bleList) {
+        if ([item isEqualToString:name]) {
+            return  true;
+        }
+    }
+    return false;
+}
+
 
 - (void)stopScan{
     if (self.centralManager.isScanning) {
-        [self showLog:[NSString stringWithFormat:@"ble:停止扫描"]];
+        [self showLog:[NSString stringWithFormat:@":停止扫描"]];
         [self.centralManager stopScan];
     }
 }
 
 /// 连接设备
 - (void)connectPeripheral:(CBPeripheral *)peripheral{
-    [self showLog:[NSString stringWithFormat:@"connectPeripheral:连接设备"]];
+    [self showLog:[NSString stringWithFormat:@"连接设备 %@",peripheral.description]];
     self.crrentPeripheral = peripheral;
     [self.centralManager connectPeripheral:peripheral options:@{CBConnectPeripheralOptionNotifyOnConnectionKey : [NSNumber numberWithBool:YES]}];
 }
     [self.crrentPeripheral writeValue:data forCharacteristic:self.deviceInfoCha type:CBCharacteristicWriteWithResponse];
 }
 
-////自动连接,获取已配对的蓝牙,取第一个连接
-//- (void)autoConnectDevice{
-//    //如果是已连接或者正在连接,则不再重连
-//    if (self.crrentPeripheral && (self.crrentPeripheral.state == CBPeripheralStateConnected || self.crrentPeripheral.state == CBPeripheralStateConnecting)) {
-//        return;
-//    }
-//    NSArray<CBPeripheral *> *devices = [self.centralManager retrieveConnectedPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]]];
-//    if (devices.count > 0) {
-//        CBPeripheral *peripheral = devices[0];
-//        [self showLog:[NSString stringWithFormat:@"autoConnectDevice:匹配过的设备%@",peripheral.name]];
-//        [self connectPeripheral:peripheral];
-//    }
-//
-//    // 10s自动重连
-//    [self performSelector:@selector(autoConnectDevice) withObject:nil afterDelay:10];
-//}
 - (void)showLog:(NSString *)log{
     NSString *text =  [NSString stringWithFormat:@"[BleManager] %@",log];
-    if(self.logCallBack) self.logCallBack(log);    
+    if(self.logCallBack) self.logCallBack(text);
 }
 
-//将录音数据保存
-- (void)finishRecored:(NSData *)data{
-//    NSString *doc = NSTemporaryDirectory();
-//    NSString *fullPath = [NSString stringWithFormat:@"%@1.pcm",doc];
-//    NSError *err;
-//    [data writeToFile:fullPath options:NSDataWritingAtomic error:&err];
-//    if (err) {
-//        [self showLog:[NSString stringWithFormat:@"finishRecored:录音保存失败 %@",err.description]];
-//    }
-//    else{
-//        [self showLog:[NSString stringWithFormat:@"finishRecored:录音保存成功 path = %@",fullPath]];
-//    }
-}
 @end
index 562ba7b..2322f39 100644 (file)
@@ -17,11 +17,11 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic,strong)void (^authCallBack)(BOOL isSuccess);/// 鉴权回调
 @property (nonatomic, copy)void (^aiMouseSendDeviceInfoDataCallBack)(NSString *data);/// 设备信息数据回调
 @property (nonatomic, copy)void (^aiMouseSendCmdDataCallBack)(NSString *data);/// 鼠标按键指令回调
-///录音相关
+
 @property (nonatomic, copy)void (^begainRecoredCallBack)(void);/// 录音开始回调
 @property (nonatomic, copy)void (^recordingCallBack)(NSString *data);/// 录音进行中回调
 @property (nonatomic, copy)void (^finishRecoredCallBack)(NSString *data);/// 录音结束回调
-///其他
+
 @property (nonatomic, copy)void (^aiMouseAddLogCallBack)(NSString *log);///输出日志
 
 
index b8e24af..c53275e 100644 (file)
 #import "TlwMouseSdk.h"
 #import "TimerManager.h"
 
-@interface DeviceManger()<TlwMouseDelegate>
+@interface DeviceManger()<TlwMouseDelegate,AiMouseDelegate>
 
 @property (nonatomic, strong) AiMouseDeviceInfo *deviceInfo;
 @property (nonatomic,strong) NSMutableData *recordData;//录音的数据
 @property (nonatomic,strong) BleManager *ble;
 @property (nonatomic,strong) HidManager *hid;
-@property (nonatomic,strong) NSString *mouseName;
+@property (nonatomic,strong) NSArray *mouseNames;
+
+@property (nonatomic,strong) TlwMouse *tlwSdk;
+@property (nonatomic,strong) AiMouse *frkSdk;
+
 //connectType 返回为0代表蓝牙,为1代表usb
 @property (nonatomic, copy)void (^aiMouseConnectStateDidChangeCallBack)(int connectType, BOOL connected);/// 设备连接状态回调
 @end
@@ -27,8 +31,6 @@
     static DeviceManger *manager = nil;
     static dispatch_once_t oncePredicate;
     dispatch_once(&oncePredicate, ^{
-        
-        [[TlwMouse shared] setLogLevel:(TlwMouseLogLevel_info)];
         manager = [[DeviceManger alloc]init];
         
     });
 - (instancetype)init{
     self = [super init];
     if (self) {
-        [[TlwMouse shared] setDelegate:self];
+        self.tlwSdk = [[TlwMouse alloc] init];
+        [self.tlwSdk setDelegate:self];
+        [self.tlwSdk setLogLevel:(TlwMouseLogLevel_info)];
+        
+        
+        
         [self setupBle];
         [self setupHid];
         [self setupTimer];
     }
     return self;
 }
-
--(AiMouseConnectType)connectType{
-    return [TlwMouse shared].connectType;
-}
-
 #pragma mark ------ 设备初始化
 - (void)setupTimer{
     [TimerManager shared].timerCallBack = ^{
         [self showLog:@"timer action。。。"];
-        if([TlwMouse shared].connected){
+        if(self.tlwSdk.connected){
             [self.ble stopScan];
 //            [self.hid close];
         }
         else{
-            if(self.mouseName.length > 0 ) {
-                [self.ble startScanWithName:self.mouseName];
+            if(self.mouseNames.count > 0 ) {
+                [self.ble startScanWithName:self.mouseNames];
                 [self.hid open];
             }
         }
         if (connected) {
             [ws.ble stopScan];
         }
-        [[TlwMouse shared] switchConnect:AiMouseConnectType_hid isConnected:connected];
+        [ws.tlwSdk switchConnect:AiMouseConnectType_hid isConnected:connected];
         
     };
     self.hid.receiveInfoDataCallBack = ^(NSData *data) {
-        [[TlwMouse shared] sendDeviceDataToSdk:data];
+        [ws.tlwSdk sendDeviceDataToSdk:data];
     };
     self.hid.receiveVoiceDataCallBack = ^(NSData *data) {
-        [[TlwMouse shared] sendAiDataToSdk:data];
+        [ws.tlwSdk sendAiDataToSdk:data];
     };
     
     self.hid.logCallBack = ^(NSString * _Nonnull log) {
 }
 
 - (void)setupBle{
-    self.ble = [BleManager shared];
+    self.ble = [[BleManager alloc] init];
     __weak typeof(self) ws = self;
     
     self.ble.connectStateCallBack = ^(BOOL connected) {
         if (connected) {
             [ws.hid close];
         }
-        [[TlwMouse shared] switchConnect:AiMouseConnectType_bluetooth isConnected:connected];
+        [ws.tlwSdk switchConnect:AiMouseConnectType_bluetooth isConnected:connected];
     };
     self.ble.receiveInfoDataCallBack = ^(NSData *data) {
-        [[TlwMouse shared] sendDeviceDataToSdk:data];
+        [ws.tlwSdk sendDeviceDataToSdk:data];
     };
     self.ble.receiveVoiceDataCallBack = ^(NSData *data) {
-        [[TlwMouse shared] sendAiDataToSdk:data];
+        [ws.tlwSdk sendAiDataToSdk:data];
     };
     
     self.ble.logCallBack = ^(NSString * _Nonnull log) {
 
 #pragma mark ------ 设备相关接口
 - (NSString *)getCurrentConnectType {
-    if ([TlwMouse shared].connectType == AiMouseConnectType_bluetooth) {
+    if (self.tlwSdk.connectType == AiMouseConnectType_bluetooth) {
         return @"0";
     }
     else {
         return @"1";
     }
 }
+-(AiMouseConnectType)connectType{
+    return self.tlwSdk.connectType;
+}
+
 
 - (void)begainMonitorAiMouseConnectStateDidChange:(NSString *)mouseName callBack:(void(^)(int connectType, BOOL connected))callBack{
     self.aiMouseConnectStateDidChangeCallBack = callBack;
-    self.mouseName = mouseName;
+    self.mouseNames = @[mouseName];
 }
 ///获取设备信息
 - (void)getDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))completation{
     [self showLog:@"getDeviceInfo request"];
-    [[TlwMouse shared] getDeviceInfo:^(TlwDeviceInfo *deviceInfo, NSError *error) {
+    [self.tlwSdk getDeviceInfo:^(TlwDeviceInfo *deviceInfo, NSError *error) {
         
         NSString *CPI_list = @"800,1200,1800,2400";// 1-4,800 1200 1800 2400
         NSString *cpi = [[CPI_list componentsSeparatedByString:@","] objectAtIndex:deviceInfo.DPI - 1];
     
     if (dict[[NSString stringWithFormat:@"%ld",value]]) {
         int num = [dict[[NSString stringWithFormat:@"%ld",value]] intValue];
-        [[TlwMouse shared] setDPI:num completation:finished];
+        [self.tlwSdk setDPI:num completation:finished];
     }
     else{
         [self showLog:[NSString stringWithFormat:@"CPI值设置错误 %ld",value]];
 ///   - value: 品牌名称
 ///   - finished: 设置结果回调
 - (void)setBrand:(NSString *)brand completation:(void (^)(BOOL isSuccess,NSError *error))finished {
-//    [[TlwMouse shared] setBrand:brand completation:finished];
+//    [self.tlwSdk setBrand:brand completation:finished];
     finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"请求失败"}]);
 }
 
 /// 设置录音模式
 - (void)setRecordMode:(int)mode completation:(void (^)(BOOL isSuccess,NSError *error))finished{
-//    [[TlwMouse shared] setRecordMode:mode completation:finished];
+//    [self.tlwSdk setRecordMode:mode completation:finished];
     finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"请求失败"}]);
 }
 
 /// 设置长按滚轮弹出的网页地址
 - (void)setUrl:(NSString *)url completation:(void (^)(BOOL isSuccess,NSError *error))finished{
-//    [[TlwMouse shared] setUrl:url completation:finished];
+//    [self.tlwSdk setUrl:url completation:finished];
     finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"请求失败"}]);
 }
 
 /// 设置长按滚轮弹出网页开关
 - (void)setUrlState:(int)state completation:(void (^)(BOOL isSuccess,NSError *error))finished{
-//    [[TlwMouse shared] setUrlState:state completation:finished];
+//    [self.tlwSdk setUrlState:state completation:finished];
     finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"请求失败"}]);
 }
 
 /// 设置鼠标连接模式
 - (void)setMouseMode:(int)mode completation:(void (^)(BOOL isSuccess,NSError *error))finished{
-//    [[TlwMouse shared] setMouseMode:mode completation:finished];
+//    [self.tlwSdk setMouseMode:mode completation:finished];
     finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"请求失败"}]);
 }
 
 /// 获取录音模式
 - (void)getRecordMode:(void (^)(int mode,NSError *error))finished{
-//    [[TlwMouse shared] getRecordMode:complete];
+//    [self.tlwSdk getRecordMode:complete];
     finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"请求失败"}]);
 }
 
 /// 获取长按滚轮弹出的网页地址
 - (void)getUrl:(void (^)(NSString *url,NSError *error))finished{
-//    [[TlwMouse shared] getUrl:complete];
+//    [self.tlwSdk getUrl:complete];
     finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"请求失败"}]);
 }
 
 /// 获取长按滚轮弹出的网页地址开关状态
 - (void)getUrlState:(void (^)(int state,NSError *error))finished{
-//    [[TlwMouse shared] getUrlState:complete];
+//    [self.tlwSdk getUrlState:complete];
     finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"请求失败"}]);
 }
 
 /// 获取鼠标连接模式
 - (void)getMouseModel:(void (^)(int mode,NSError *error))finished{
-//    [[TlwMouse shared] getMouseModel:complete];
+//    [self.tlwSdk getMouseModel:complete];
     finished(0,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"请求失败"}]);
 }
 
 /// 打开录音
 - (void)openRecord:(void (^)(BOOL isSuccess,NSError *error))finished{
-    [[TlwMouse shared] openRecord:finished];
+    [self.tlwSdk openRecord:finished];
 }
 
 /// 关闭录音
 - (void)closeRecord:(void (^)(BOOL isSuccess,NSError *error))finished{
-    [[TlwMouse shared] closeRecord:finished];
+    [self.tlwSdk closeRecord:finished];
 }
 
 
 
 #pragma mark - TlwMouseDelegate
+// 连接状态改变
+- (void)tlwMouseConnectStateDidChange:(BOOL)connected{
+    [self showLog:[NSString stringWithFormat:@"%@设备连接状态返回: %@",self.tlwSdk.connectType == AiMouseConnectType_bluetooth ? @"蓝牙 ":@"USB",connected ? @"true":@"false"]];
+    
+    if (self.aiMouseConnectStateDidChangeCallBack) {
+        self.aiMouseConnectStateDidChangeCallBack(self.tlwSdk.connectType == AiMouseConnectType_bluetooth ? 0:1,connected);
+    }
+    if(self.authCallBack && connected)self.authCallBack(connected);
+}
 /// 设备信息数据回调,需要将此数据通过设备信息特征转发给蓝牙设备
 /// - Parameter data: 数据
 -(void)tlwMouseSendDeviceInfoData:(NSData *)data{
-    if ([TlwMouse shared].connectType == AiMouseConnectType_bluetooth) {
+    if (self.tlwSdk.connectType == AiMouseConnectType_bluetooth) {
         [self.ble writeToDevice:data];
     }
-    else if ([TlwMouse shared].connectType == AiMouseConnectType_hid){
+    else if (self.tlwSdk.connectType == AiMouseConnectType_hid){
         [self.hid writeToDevice:data];
     }
     
         [self showLog:@"结束录音"];
         [self finishRecored:self.recordData];
         if (self.finishRecoredCallBack) {
-            // 将NSData转换为Base64编码的字符串
             NSString *base64String = [self.recordData base64EncodedStringWithOptions:0];
             self.finishRecoredCallBack(base64String);
         }
     [self.recordData appendData:data];
     if (self.recordingCallBack) {
         // 将NSData转换为Base64编码的字符串
-        NSString *base64String = [data base64EncodedStringWithOptions:0];
-        self.recordingCallBack(base64String);
+        self.recordingCallBack( [data base64EncodedStringWithOptions:0]);
     }
 }
 /// 输出日志
-- (void)aiMouseAddLog:(NSString *)log {
+- (void)tlwMouseAddLog:(NSString *)log {
     if (self.aiMouseAddLogCallBack) {
         self.aiMouseAddLogCallBack(log);
     }
 }
 
-// 连接状态改变
-- (void)tlwMouseConnectStateDidChange:(BOOL)connected{
-    [self showLog:@"连接结果回调"];
-    [self showLog:[NSString stringWithFormat:@"%@设备连接状态返回: %@",[TlwMouse shared].connectType == AiMouseConnectType_bluetooth ? @"蓝牙 ":@"USB",connected ? @"true":@"false"]];
+#pragma mark - AiMouseDelegate
+/// 设备连接状态
+/// - Parameter connected: 是否连接
+- (void)aiMouseConnectStateDidChange:(BOOL)connected{
+    [self showLog:[NSString stringWithFormat:@"%@设备连接状态返回: %@",self.frkSdk.connectType == AiMouseConnectType_bluetooth ? @"蓝牙 ":@"USB",connected ? @"true":@"false"]];
     
-    [self showLog:@"准备连接回调"];
     if (self.aiMouseConnectStateDidChangeCallBack) {
-        [self showLog:@"连接回调"];
-        self.aiMouseConnectStateDidChangeCallBack([TlwMouse shared].connectType == AiMouseConnectType_bluetooth ? 0:1,connected);
-        [self showLog:@"连接回调结束"];
-    }
-    [self showLog:@"准备鉴权回调"];
-    if (connected == true) {
-        [self showLog:@"鉴权回调"];
+        self.aiMouseConnectStateDidChangeCallBack(self.frkSdk.connectType == AiMouseConnectType_bluetooth ? 0:1,connected);
     }
     if(self.authCallBack && connected)self.authCallBack(connected);
-    [self showLog:@"鉴权回调结束"];
 }
 
+/// 鉴权结果返回
+/// - Parameter authState: 鉴权状态
+- (void)aiMouseAuthenticationResult:(AiMouseAuthState)authState{
+    //千寻暂时去掉鉴权
+}
+
+/// 设备信息数据回调,需要将此数据通过设备信息特征转发给蓝牙设备
+/// - Parameter data: 数据
+- (void)aiMouseSendDeviceInfoData:(NSData *)data{
+    if (self.frkSdk.connectType == AiMouseConnectType_bluetooth) {
+        [self.ble writeToDevice:data];
+    }
+    else if (self.frkSdk.connectType == AiMouseConnectType_hid){
+        [self.hid writeToDevice:data];
+    }
+}
+
+/// 鼠标按键指令回调
+/// - Parameter data: 数据。
+/// 前  第一次单击31(开始录音), 第二次单击32(结束录音) , 按下21(开始录音)抬起22(结束录音)
+/// 中  单击42, 按下25(开始录音)抬起26(结束录音)
+/// 后  单击43,按下27(开始录音)抬起28(结束录音)
+/// 其他未定义
+- (void)aiMouseSendCmdData:(NSData *)data{
+    uint8 cmd;
+    [data getBytes:&cmd length:1];
+        
+    if (self.aiMouseSendCmdDataCallBack) {
+        self.aiMouseSendCmdDataCallBack([NSString stringWithFormat:@"%X",cmd]);
+    }
+    
+    if(cmd == 0x31 || cmd == 0x21 || cmd == 0x25 ||cmd == 0x27){
+        [self showLog:@"开始录音"];
+        self.recordData = [[NSMutableData alloc] init];
+        if (self.begainRecoredCallBack) {
+            self.begainRecoredCallBack();
+        }
+    }
+    else if(cmd == 0x32 || cmd == 0x22 || cmd == 0x26 ||cmd == 0x28){
+        [self showLog:@"结束录音"];
+        [self finishRecored:self.recordData];
+        if (self.finishRecoredCallBack) {
+            NSString *base64String = [self.recordData base64EncodedStringWithOptions:0];
+            self.finishRecoredCallBack(base64String);
+        }
+    }
+}
+
+/// 录音回调
+/// - Parameter data: pcm格式语音数据
+- (void)aiMouseSendRecordData:(NSData *)data{
+    [self.recordData appendData:data];
+    if (self.recordingCallBack) {
+        self.recordingCallBack( [data base64EncodedStringWithOptions:0]);
+    }
+}
+
+/// 输出sdk日志
+/// - Parameter log: 日志
+- (void)aiMouseAddLog:(NSString *)log{
+    if (self.aiMouseAddLogCallBack) {
+        self.aiMouseAddLogCallBack(log);
+    }
+}
+
+/// hid数据异常,需要重新开启监听usb设备
+- (void)hidDataError{
+    [self.hid open];
+}
+#pragma mark - other
 - (void)showLog:(NSString *)log{
     NSLog(@"[AiMouseSdk] %@",log);
 }
 
-//将录音数据保存
 - (void)finishRecored:(NSData *)data{
     NSString *doc = NSTemporaryDirectory();
     NSString *fullPath = [NSString stringWithFormat:@"%@1.pcm",doc];
index f06526a..f48e05a 100644 (file)
@@ -8,7 +8,6 @@
 #import "ScanVC.h"
 #import "ScanCell.h"
 #import "DeviceManger.h"
-#import "BleManager.h"
 @interface ScanVC ()<NSTableViewDelegate,NSTableViewDataSource>
 @property (nonatomic,strong) NSTableView *tableView;
 @property (nonatomic,strong) NSMutableArray<CBPeripheral *> *scanArray;
@@ -68,9 +67,9 @@
 }
 
 - (void)setupBleManger{
-    BleManager *manager = [BleManager shared];
-    __weak typeof(self) weakSelf= self;
-    __weak typeof(BleManager) *weakManager = manager;
+//    BleManager *manager = [BleManager shared];
+//    __weak typeof(self) weakSelf= self;
+//    __weak typeof(BleManager) *weakManager = manager;
 //    manager.discoverDevice = ^(CBPeripheral *peripheral){
 //        if ([weakSelf.scanArray containsObject:peripheral]){
 //            return;
index 603c230..a5ccafc 100644 (file)
@@ -8,7 +8,6 @@
 #import "TlwScanVC.h"
 
 #import "ScanCell.h"
-#import "TlwDeviceManger.h"
 @interface TlwScanVC ()<NSTableViewDelegate,NSTableViewDataSource>
 @property (nonatomic,strong) NSTableView *tableView;
 @property (nonatomic,strong) NSMutableArray<CBPeripheral *> *scanArray;