@optional
/// 输出sdk日志
/// - Parameter log: 日志
-- (void)aiMouseAddLog:(NSString *)log;
+- (void)tlwMouseAddLog:(NSString *)log;
@end
@property (nonatomic, weak) id<TlwMouseDelegate> delegate;/// 代理
@property (nonatomic, readonly) AiMouseConnectType connectType;//连接类型
@property (nonatomic, readonly) BOOL connected;//是否已连接
-
-/// 单利
-+(TlwMouse *)shared;
+//
+///// 单利
+//+(TlwMouse *)shared;
/// 设置日志等级
/// - Parameter level: 等级
@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);
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 */,
filePath = "MouseSdk/Ble/DeviceManger.m"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
- startingLineNumber = "251"
- endingLineNumber = "251"
+ startingLineNumber = "266"
+ endingLineNumber = "266"
landmarkName = "-tlwMouseSendDeviceInfoData:"
landmarkType = "7">
</BreakpointContent>
@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;
@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
@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);///输出日志
#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
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];
#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;
}
- (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;
#import "TlwScanVC.h"
#import "ScanCell.h"
-#import "TlwDeviceManger.h"
@interface TlwScanVC ()<NSTableViewDelegate,NSTableViewDataSource>
@property (nonatomic,strong) NSTableView *tableView;
@property (nonatomic,strong) NSMutableArray<CBPeripheral *> *scanArray;