//
#import "AiAudioManager.h"
-#import "AiTools.h"
+#import "AiMouseTools.h"
#import "AiAudioDecoder.h"
@interface AiAudioManager ()
- (void)receiveData:(NSData *)data{
[self.audioDecoder decodeSBCData:data];
-// NSString *str = [[AiTools dataToHexString:data] lowercaseString];
+// NSString *str = [[AiMouseTools dataToHexString:data] lowercaseString];
// NSString *cmd = [str substringWithRange:NSMakeRange(0, 12)];
// if([cmd hasPrefix:@"0a"] && [cmd hasSuffix:@"31"]){
//// 0x0a6500002a3100020101c0c1a5a5a5a5
self.audioDecoder = [AiAudioDecoder sharedInstance];
__weak typeof(self) ws = self;
self.audioDecoder.onRecvPCMData = ^(NSData * _Nonnull pcmData) {
-// [ws showLog:[NSString stringWithFormat:@"转换后数据%@",[AiTools dataToHexString:pcmData]]];
+// [ws showLog:[NSString stringWithFormat:@"转换后数据%@",[AiMouseTools dataToHexString:pcmData]]];
if(ws.audioRecordCallBack)ws.audioRecordCallBack(pcmData);
};
[self.audioDecoder initSBCDecodec];
#import "AiAuthManager.h"
#import <AliIotConnectKit/AliIotConnectKit.h>
-#import "AiTools.h"
+#import "AiMouseTools.h"
@interface AiAuthManager () <IotStateDelatege_C,BleNeedSendDataDelegate_C>
@property (nonatomic, strong) dispatch_queue_t bizbus_connect_queue;
@property (nonatomic, strong) AliConnectMananger_C * bizbusManager;
#pragma mark - BleNeedSendDataDelegate_C
- (void)sendBleDataWithData:(NSData * _Nonnull)data {
- [self showLog:[NSString stringWithFormat:@"[bizbus send json] %@",[AiTools dataToUtf8String:data]]];
+ [self showLog:[NSString stringWithFormat:@"[bizbus send json] %@",[AiMouseTools dataToUtf8String:data]]];
__weak typeof(self) ws = self;
dispatch_async(_bizbus_connect_queue, ^{
if (ws.outputData) ws.outputData(data);
#pragma mark - pub api
- (void)receiveData:(NSData *)data {
- [self showLog:[NSString stringWithFormat:@"[bizbus receive json] %@",[AiTools dataToUtf8String:data]]];
+ [self showLog:[NSString stringWithFormat:@"[bizbus receive json] %@",[AiMouseTools dataToUtf8String:data]]];
__weak typeof(self) ws = self;
dispatch_async(_bizbus_connect_queue, ^{
[ws.bizbusManager bleDataReceivedWithData:data];
//
#import "AiFrameManager.h"
-#import "AiTools.h"
+#import "AiMouseTools.h"
@interface AiFrameManager()
@property (nonatomic,strong)NSMutableData *recvData;
@implementation AiFrameManager
- (void)didReceiveFrameData:(NSData *)data{
- NSString *str = [AiTools dataToUtf8String:data];
+ NSString *str = [AiMouseTools dataToUtf8String:data];
if ([str isEqualTo:@"-$$"]) {
//开始
self.recvData = [[NSMutableData alloc] init];
//
#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
+#import <AiMouseSdk/AiMouseDeviceInfo.h>
typedef NS_ENUM(NSInteger,AiMouseAuthState) {
AiMouseAuthState_Unknow = 0,///未知
/// - Parameter data: 数据
- (void)aiMouseSendAuthData:(NSData *)data;
+/// 设备信息数据回调,需要将此数据通过设备信息特征转发给蓝牙设备
+/// - Parameter data: 数据
+- (void)aiMouseSendDeviceInfoData:(NSData *)data;
+
/// 鼠标按键指令回调
/// - Parameter data: 数据。AI键0x42 单击 0x25 按下(开始录音) 0x26抬起(结束录音); 语音键0x31开始录音,0x32结束录音;OCR 按键 单击 0x41;其他未定义
- (void)aiMouseSendCmdData:(NSData *)data;
/// 传输业务数据给sdk
/// - Parameter data:ai特征传过来的数据
- (void)sendAiDataToSdk:(NSData *)data;
+
+/// 传输设备信息数据给sdk
+/// - Parameter data:设备信息特征传过来的数据
+- (void)sendDeviceDataToSdk:(NSData *)data;
+
+/// 获取设备信息
+/// - Parameter completation: 如果获取成功,则deviceInfo有值,否则为空
+- (void)getDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))completation;
+
+/// 设置CPI
+/// - Parameters:
+/// - value: AiMouseDeviceInfo 中可以设置的值CPI_list
+/// - finished: 设置结果回调
+- (void)setCPI:(NSInteger)value completation:(void (^)(BOOL isSuccess,NSError *error))finished;
@end
-NS_ASSUME_NONNULL_END
#import "AiFrameManager.h"
#import "AiAuthManager.h"
#import "AiAudioManager.h"
-#import "AiTools.h"
+#import "AiMouseTools.h"
+#import "AiMouseDeviceInfo.h"
@interface AiMouse()
@property (nonatomic, strong) AiFrameManager *frameManager;
@property (nonatomic, strong) AiAuthManager *authManager;
@property (nonatomic, strong) AiAudioManager *audioManager;
+@property (nonatomic, strong) AiMouseDeviceInfo *deviceInfo;
+@property (nonatomic, strong) void (^deviceInfoBlock)(AiMouseDeviceInfo *deviceInfo,NSError *error);
+@property (nonatomic, strong) void (^setCPIBlock)(BOOL isSuccess,NSError *error);
@end
@implementation AiMouse
}
- (void)sendAiDataToSdk:(NSData *)data{
- NSString *str = [[AiTools dataToHexString:data] lowercaseString];
+ NSString *str = [[AiMouseTools dataToHexString:data] lowercaseString];
NSString *cmd = [str substringWithRange:NSMakeRange(0, 12)];
-// 0A65004E003200010101C0C10000A5A5
+ // 0A65004E003200010101C0C10000A5A5
if(data.length == 16){
NSData *cmd = [data subdataWithRange:NSMakeRange(5, 1)];
[self sendCmdData:cmd];
}
}
+-(void)sendDeviceDataToSdk:(NSData *)data{
+ NSLog(@"======%@",[AiMouseTools dataToUtf8String:data]);
+ NSDictionary *dict = [AiMouseTools dataToDictionary:data];
+ if(dict[@"set_config"]){
+ if([dict[@"set_config"] intValue] == 1){
+ if(self.setCPIBlock)self.setCPIBlock(true, nil);
+ }
+ else{
+ if(self.setCPIBlock)self.setCPIBlock(false, [NSError errorWithDomain:@"AiMouse SDK Error" code:-1 userInfo:@{@"NSLocalizedDescriptionKey":@"设置cpi失败"}]);
+ }
+ }
+ else{
+ if (dict[@"battery_power"]) {
+ self.deviceInfo.battery_power = dict[@"battery_power"];
+ [self sendDeviceInfoData:[AiMouseTools dictionaryToData:@{@"cmd":@"get_CPI"}]];
+ }
+ else if(dict[@"CPI"]) {
+ self.deviceInfo.CPI = dict[@"CPI"];
+ [self sendDeviceInfoData:[AiMouseTools dictionaryToData:@{@"cmd":@"get_CPI_list"}]];
+ }
+ else if(dict[@"CPI_list"]) {
+ self.deviceInfo.CPI_list = dict[@"CPI_list"];
+ [self sendDeviceInfoData:[AiMouseTools dictionaryToData:@{@"cmd":@"get_version"}]];
+ }
+ else if(dict[@"version"]) {
+ self.deviceInfo.version = dict[@"version"];
+ [self sendDeviceInfoData:[AiMouseTools dictionaryToData:@{@"cmd":@"get_brand"}]];
+ }
+ else if(dict[@"brand"]) {
+ self.deviceInfo.brand = dict[@"brand"];
+ [self sendDeviceInfoData:[AiMouseTools dictionaryToData:@{@"cmd":@"get_SN"}]];
+ }
+ else if(dict[@"SN"]) {
+ self.deviceInfo.sn = dict[@"SN"];
+ [self sendDeviceInfoData:[AiMouseTools dictionaryToData:@{@"cmd":@"get_MAC"}]];
+ }
+ else if(dict[@"MAC"]) {
+ self.deviceInfo.mac = dict[@"MAC"];
+ if(self.deviceInfoBlock){
+ self.deviceInfoBlock(self.deviceInfo, nil);
+ }
+ }
+ else{
+ if(self.deviceInfoBlock){
+ self.deviceInfoBlock(nil, [NSError errorWithDomain:@"AiMouse SDK Error" code:-1 userInfo:@{@"NSLocalizedDescriptionKey":@"获取设备信息失败"}]);
+ }
+ }
+ }
+
+}
+- (void)getDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))completation{
+ self.deviceInfo = [[AiMouseDeviceInfo alloc] init];
+ self.deviceInfoBlock = completation;
+ NSData *data = [AiMouseTools dictionaryToData:@{@"cmd":@"get_battery_power"}];
+ [self sendDeviceInfoData:data];
+}
+
+- (void)setCPI:(NSInteger)value completation:(void (^)(BOOL isSuccess,NSError *error))finished{
+ self.setCPIBlock = finished;
+ NSData *data = [AiMouseTools dictionaryToData:@{@"cmd":@"set_config",@"set_CPI":[NSString stringWithFormat:@"%ld",value]}];
+ [self sendDeviceInfoData:data];
+}
#pragma mark - other
- (void)sendAuthData:(NSData *)data{
if (self.delegate) {
[self.delegate aiMouseSendAuthData:data];
}
}
+- (void)sendDeviceInfoData:(NSData *)data{
+ if (self.delegate) {
+ [self.delegate aiMouseSendDeviceInfoData:data];
+ }
+}
- (void)sendRecordData:(NSData *)data{
if (self.authState != AiMouseAuthState_Success) return;
if (self.delegate) {
[self.delegate aiMouseAuthStateDidChange:self.authState];
}
+ [self setAuthStateToDevice:isSuccess];
}
- (void)showLog:(NSString *)log{
-// NSLog(@"[sdk]%@",log);
+ // NSLog(@"[sdk]%@",log);
}
- (void)sendTestLP{
NSString *cmd = @"7B22736964223A22464753222C22766572223A312C2264617461223A227B5C227369647665725C223A312C5C226D73675F747970655C223A5C224647535F4D53475F545950455F53544152545F4647535F5245515C227D227D";
- NSData *data = [AiTools hexStringToData:cmd];
+ NSData *data = [AiMouseTools hexStringToData:cmd];
[self sendAuthData:data];
}
+
+#pragma mark - deviceInfo
+- (void)setAuthStateToDevice:(BOOL)isSuccess{
+ NSData *data = [AiMouseTools dictionaryToData:@{@"cmd":@"set_config",@"set_activated_dtate":isSuccess?@"1":@"0"}];
+ [self sendDeviceInfoData:data];
+}
@end
--- /dev/null
+//
+// AiMouseDeviceInfo.h
+// AiMouseSdk
+//
+// Created by incar on 2024/3/19.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface AiMouseDeviceInfo : NSObject
+@property (nonatomic, strong) NSString *battery_power;/// 电池百分百电量,0-100
+@property (nonatomic, strong) NSString *CPI;/// CPI值
+@property (nonatomic, strong) NSString *CPI_list;/// 可设置的CPI参数列表
+@property (nonatomic, strong) NSString *version;///软件版本
+@property (nonatomic, strong) NSString *brand;/// 品牌名称
+@property (nonatomic, strong) NSString *sn;/// 设备序列号
+@property (nonatomic, strong) NSString *mac;///设备MAC地址
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// AiMouseDeviceInfo.m
+// AiMouseSdk
+//
+// Created by incar on 2024/3/19.
+//
+
+#import "AiMouseDeviceInfo.h"
+
+@implementation AiMouseDeviceInfo
+
+
+@end
// In this header, you should import all the public headers of your framework using statements like #import <AiMouse/PublicHeader.h>
#import <AiMouseSdk/AiMouse.h>
-#import <AiMouseSdk/AiTools.h>
+#import <AiMouseSdk/AiMouseTools.h>
//
-// AiTools.h
+// AiMouseTools.h
// AiMouse
//
// Created by incar on 2024/2/28.
NS_ASSUME_NONNULL_BEGIN
-@interface AiTools : NSObject
+@interface AiMouseTools : NSObject
+ (NSArray *)stringToArray:(NSString *)jsonString;
+ (NSString *)arrayToString:(NSArray *)arr;
//
-// AiTools.m
+// AiMouseTools.m
// AiMouse
//
// Created by incar on 2024/2/28.
//
-#import "AiTools.h"
+#import "AiMouseTools.h"
-@implementation AiTools
+@implementation AiMouseTools
+ (NSArray *)stringToArray:(NSString *)jsonString{
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
18BF1E8A2B8362D300B8D90F /* AiMouseSdk.h in Headers */ = {isa = PBXBuildFile; fileRef = 18BF1E892B8362D300B8D90F /* AiMouseSdk.h */; settings = {ATTRIBUTES = (Public, ); }; };
18BF1E8D2B8362D300B8D90F /* AiMouseSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF1E872B8362D300B8D90F /* AiMouseSdk.framework */; };
18BF1E8E2B8362D300B8D90F /* AiMouseSdk.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF1E872B8362D300B8D90F /* AiMouseSdk.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 18BF8F4E2BA9A7A4008F6933 /* AiMouseDeviceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 18BF8F4C2BA9A7A4008F6933 /* AiMouseDeviceInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 18BF8F4F2BA9A7A4008F6933 /* AiMouseDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 18BF8F4D2BA9A7A4008F6933 /* AiMouseDeviceInfo.m */; };
18CB080C2BA401D0005F5854 /* liblzma.5.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 18CB080B2BA401D0005F5854 /* liblzma.5.tbd */; };
18CB089B2BA40282005F5854 /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = 18CB08102BA40282005F5854 /* version.h */; };
18CB089C2BA40282005F5854 /* buffersrc.h in Headers */ = {isa = PBXBuildFile; fileRef = 18CB08112BA40282005F5854 /* buffersrc.h */; };
18F323872B8F338300CABA2E /* AliIotConnectKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18F3237D2B8F2EFC00CABA2E /* AliIotConnectKit.framework */; };
18F3238E2B8F4F7300CABA2E /* AiAudioManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F3238C2B8F4F7300CABA2E /* AiAudioManager.h */; };
18F3238F2B8F4F7300CABA2E /* AiAudioManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F3238D2B8F4F7300CABA2E /* AiAudioManager.m */; };
- 18F323952B8F525C00CABA2E /* AiTools.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F323932B8F525C00CABA2E /* AiTools.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 18F323962B8F525C00CABA2E /* AiTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323942B8F525C00CABA2E /* AiTools.m */; };
+ 18F323952B8F525C00CABA2E /* AiMouseTools.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F323932B8F525C00CABA2E /* AiMouseTools.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 18F323962B8F525C00CABA2E /* AiMouseTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323942B8F525C00CABA2E /* AiMouseTools.m */; };
18F323A82B9095D300CABA2E /* AiAudioConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F323A62B9095D300CABA2E /* AiAudioConverter.h */; };
18F323A92B9095D300CABA2E /* AiAudioConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323A72B9095D300CABA2E /* AiAudioConverter.m */; };
18F323C42B93352000CABA2E /* AiAudioDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F323C22B93352000CABA2E /* AiAudioDecoder.h */; };
18BF1E752B832D2E00B8D90F /* ScanVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScanVC.m; sourceTree = "<group>"; };
18BF1E872B8362D300B8D90F /* AiMouseSdk.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AiMouseSdk.framework; sourceTree = BUILT_PRODUCTS_DIR; };
18BF1E892B8362D300B8D90F /* AiMouseSdk.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiMouseSdk.h; sourceTree = "<group>"; };
+ 18BF8F4C2BA9A7A4008F6933 /* AiMouseDeviceInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiMouseDeviceInfo.h; sourceTree = "<group>"; };
+ 18BF8F4D2BA9A7A4008F6933 /* AiMouseDeviceInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiMouseDeviceInfo.m; sourceTree = "<group>"; };
18CB080B2BA401D0005F5854 /* liblzma.5.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = liblzma.5.tbd; path = usr/lib/liblzma.5.tbd; sourceTree = SDKROOT; };
18CB08102BA40282005F5854 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = "<group>"; };
18CB08112BA40282005F5854 /* buffersrc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffersrc.h; sourceTree = "<group>"; };
18F323832B8F330100CABA2E /* AiAuthManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiAuthManager.m; sourceTree = "<group>"; };
18F3238C2B8F4F7300CABA2E /* AiAudioManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiAudioManager.h; sourceTree = "<group>"; };
18F3238D2B8F4F7300CABA2E /* AiAudioManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiAudioManager.m; sourceTree = "<group>"; };
- 18F323932B8F525C00CABA2E /* AiTools.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiTools.h; sourceTree = "<group>"; };
- 18F323942B8F525C00CABA2E /* AiTools.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiTools.m; sourceTree = "<group>"; };
+ 18F323932B8F525C00CABA2E /* AiMouseTools.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiMouseTools.h; sourceTree = "<group>"; };
+ 18F323942B8F525C00CABA2E /* AiMouseTools.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiMouseTools.m; sourceTree = "<group>"; };
18F323A62B9095D300CABA2E /* AiAudioConverter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiAudioConverter.h; sourceTree = "<group>"; };
18F323A72B9095D300CABA2E /* AiAudioConverter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiAudioConverter.m; sourceTree = "<group>"; };
18F323C22B93352000CABA2E /* AiAudioDecoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiAudioDecoder.h; sourceTree = "<group>"; };
18BF1E892B8362D300B8D90F /* AiMouseSdk.h */,
18AE9CDE2B99C71F00743515 /* AiMouse.h */,
18AE9CDF2B99C71F00743515 /* AiMouse.m */,
+ 18BF8F4C2BA9A7A4008F6933 /* AiMouseDeviceInfo.h */,
+ 18BF8F4D2BA9A7A4008F6933 /* AiMouseDeviceInfo.m */,
18F328DC2B9950E000CABA2E /* AiFrameManager.h */,
18F328DD2B9950E000CABA2E /* AiFrameManager.m */,
- 18F323932B8F525C00CABA2E /* AiTools.h */,
- 18F323942B8F525C00CABA2E /* AiTools.m */,
+ 18F323932B8F525C00CABA2E /* AiMouseTools.h */,
+ 18F323942B8F525C00CABA2E /* AiMouseTools.m */,
18F3238C2B8F4F7300CABA2E /* AiAudioManager.h */,
18F3238D2B8F4F7300CABA2E /* AiAudioManager.m */,
18F323822B8F330100CABA2E /* AiAuthManager.h */,
18CB09072BA40283005F5854 /* xvmc.h in Headers */,
18F328DE2B9950E000CABA2E /* AiFrameManager.h in Headers */,
18CB08C22BA40283005F5854 /* tree.h in Headers */,
+ 18BF8F4E2BA9A7A4008F6933 /* AiMouseDeviceInfo.h in Headers */,
18CB08A62BA40282005F5854 /* blowfish.h in Headers */,
18F323842B8F330100CABA2E /* AiAuthManager.h in Headers */,
18CB08B42BA40282005F5854 /* avutil.h in Headers */,
18CB08BD2BA40283005F5854 /* hwcontext_vaapi.h in Headers */,
18CB090D2BA40283005F5854 /* packet.h in Headers */,
18CB089E2BA40282005F5854 /* avfilter.h in Headers */,
- 18F323952B8F525C00CABA2E /* AiTools.h in Headers */,
+ 18F323952B8F525C00CABA2E /* AiMouseTools.h in Headers */,
18CB08FF2BA40283005F5854 /* avcodec.h in Headers */,
18CB08B82BA40282005F5854 /* hwcontext_vdpau.h in Headers */,
18CB08D52BA40283005F5854 /* random_seed.h in Headers */,
18F323C52B93352000CABA2E /* AiAudioDecoder.m in Sources */,
18F323A92B9095D300CABA2E /* AiAudioConverter.m in Sources */,
18F328DF2B9950E000CABA2E /* AiFrameManager.m in Sources */,
- 18F323962B8F525C00CABA2E /* AiTools.m in Sources */,
+ 18F323962B8F525C00CABA2E /* AiMouseTools.m in Sources */,
+ 18BF8F4F2BA9A7A4008F6933 /* AiMouseDeviceInfo.m in Sources */,
18AE9CE12B99C72000743515 /* AiMouse.m in Sources */,
18F323852B8F330100CABA2E /* AiAuthManager.m in Sources */,
);
#import <Foundation/Foundation.h>
#import <CoreBluetooth/CoreBluetooth.h>
+#import <AiMouseSdk/AiMouseDeviceInfo.h>
#define kDidConnectBleNotification @"kDidConnectBleNotification"
#define kDidDisconnectBleNotification @"kDidDisconnectBleNotification"
-NS_ASSUME_NONNULL_BEGIN
+
@interface BleManager : NSObject
@property (nonatomic,strong)void (^discoverDevice)(CBPeripheral *peripheral) ;/// 扫描到设备
/// - Parameter peripheral: 蓝牙设备
- (void)connectPeripheral:(CBPeripheral *)peripheral;
+/// 获取设备信息
+- (void)getDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))completation;
+
@end
-NS_ASSUME_NONNULL_END
//ai特征
#define kAiUUID @"0783B03E-8535-B5A0-7140-A304D2194CB8"
//鉴权特征
-//#define kAuthUUID @"0783B73E-8535-B5A0-7140-A304D2194CB7"
-#define kAuthUUID @"0783B03E-8535-B5A0-7140-A304D2194CB7"
+#define kAuthUUID @"0783B73E-8535-B5A0-7140-A304D2194CB7"
+//#define kAuthUUID @"0783B03E-8535-B5A0-7140-A304D2194CB7"
+//获取设备信息特征
+#define kDeviceInfoUUID @"0783B63E-8535-B5A0-7140-A304D2495CB6"
@interface BleManager ()<CBCentralManagerDelegate,CBPeripheralDelegate,AiMouseDelegate>
@property(nonatomic, strong) CBCentralManager *centralManager;///蓝牙管理
@property(nonatomic, strong) CBPeripheral *connectPeripheral;//连接的设备
@property(nonatomic, strong) CBCharacteristic *authCha;//鉴权特征
@property(nonatomic, strong) CBCharacteristic *aiCha;//ai特征
+@property(nonatomic, strong) CBCharacteristic *deviceInfoCha;//设备信息特征
@property (nonatomic,strong) NSMutableData *recordData;//录音的数据
@end
self.aiCha = characteristic;
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
+ else if ([characteristic.UUID.UUIDString isEqualToString:kDeviceInfoUUID]) {
+ self.deviceInfoCha = characteristic;
+ [peripheral setNotifyValue:YES forCharacteristic:characteristic];
+ }
}
}
//收到蓝牙数据
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
NSData *data = characteristic.value;
- [self showLog:[NSString stringWithFormat:@"[receive] %@",[AiTools dataToHexString:data]]];
+ [self showLog:[NSString stringWithFormat:@"[receive] %@",[AiMouseTools dataToHexString:data]]];
if([characteristic.UUID.UUIDString isEqualToString:kAuthUUID]){
//鉴权数据
[[AiMouse shared] sendAuthDataToSdk:data];
//AI数据
[[AiMouse shared] sendAiDataToSdk:data];
}
+ else if([characteristic.UUID.UUIDString isEqualToString:kDeviceInfoUUID]){
+ //设备信息数据
+ [[AiMouse shared] sendDeviceDataToSdk:data];
+ }
}
#pragma mark - AiDelegate
/// 鉴权数据回调,需要将此数据转发给蓝牙设备
/// - Parameter data: 数据
- (void)aiMouseSendAuthData:(NSData *)data{
- [self showLog:[NSString stringWithFormat:@"[send] %@",[AiTools dataToHexString:data]]];
+ [self showLog:[NSString stringWithFormat:@"[send] %@",[AiMouseTools dataToHexString:data]]];
[self.connectPeripheral writeValue:data forCharacteristic:self.authCha type:CBCharacteristicWriteWithoutResponse];
}
+
+
+/// 设备信息数据回调,需要将此数据通过设备信息特征转发给蓝牙设备
+/// - Parameter data: 数据
+-(void)aiMouseSendDeviceInfoData:(NSData *)data{
+ [self showLog:[NSString stringWithFormat:@"[send] %@",[AiMouseTools dataToHexString:data]]];
+ [self.connectPeripheral writeValue:data forCharacteristic:self.deviceInfoCha type:CBCharacteristicWriteWithoutResponse];
+}
+
/// 鼠标按键指令回调
/// - Parameter data: 数据。AI键0x42 单击 0x25 按下(开始录音) 0x26抬起(结束录音); 语音键0x31开始录音,0x32结束录音;OCR 按键 单击 0x41;其他未定义
- (void)aiMouseSendCmdData:(NSData *)data{
- NSString *cmd = [[AiTools dataToHexString:data] lowercaseString];
+ NSString *cmd = [[AiMouseTools dataToHexString:data] lowercaseString];
if([cmd hasSuffix:@"31"]){
[self showLog:@"录音键开始录音"];
self.recordData = [[NSMutableData alloc] init];
[self.centralManager connectPeripheral:peripheral options:@{CBConnectPeripheralOptionNotifyOnConnectionKey : [NSNumber numberWithBool:YES]}];
}
+/// 获取设备信息
+- (void)getDeviceInfo:(void (^)(AiMouseDeviceInfo * _Nonnull, NSError * _Nonnull))completation{
+ [[AiMouse shared] getDeviceInfo:completation];
+}
#pragma mark - other
//自动连接,获取已配对的蓝牙,取第一个连接
- (void)autoConnectDevice{
#import "ViewController.h"
#import "ScanVC.h"
-#import "AiTools.h"
+#import "AiMouseTools.h"
#import "BleManager.h"
+
@interface ViewController ()
@property(nonatomic,strong)NSTextField *connectLabel;
self.title = @"AI SDK";
{
- NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(100, self.view.bounds.size.height - 160, 100, 45)];
+ NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(100, self.view.bounds.size.height - 100, 100, 45)];
btn.bordered = true;
btn.title = @"扫描";
[btn setTarget:self];
self.autoLabel = label;
[self.view addSubview:label];
}
+ {
+ NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(100, self.view.bounds.size.height - 200, 100, 45)];
+ btn.bordered = true;
+ btn.title = @"获取设备信息";
+ [btn setTarget:self];
+ [btn setAction:@selector(getDeviceInfoAction)];
+ btn.state = 1;
+ [self.view addSubview:btn];
+ }
}
- (void)setupBleManger{
BleManager *manager = [BleManager shared];
[self presentViewControllerAsModalWindow:vc];
}
-- (void)checkAuth{
-// [[BleManager shared] startAuthentication];
+- (void)getDeviceInfoAction{
+ [[BleManager shared] getDeviceInfo:^(AiMouseDeviceInfo *deviceInfo, NSError *error) {
+ if (deviceInfo) {
+ NSLog(@"battery_power = %@,CPI = %@,CPI_list = %@,version = %@,brand = %@,sn = %@,mac = %@,",deviceInfo.battery_power,deviceInfo.CPI,deviceInfo.CPI_list,deviceInfo.version,deviceInfo.brand,deviceInfo.sn,deviceInfo.mac);
+ }
+ else{
+ NSLog(@"get deivce info error == %@",error.description);
+ }
+ }];
}
- (void)showAuthResult:(BOOL)isSuccess{