\r
## 引入依赖库\r
\r
-将 AliIotConnectKit.framework 添加进项目中。\r
+将 AliIotConnectKit.framework、AiSdk.framework 添加进项目中。\r
\r
## 相关权限配置\r
\r
因为sdk用到蓝牙权限,所以需要在info.plist进行相关配置\r
\r
```xml\r
-\r
<!-- 蓝牙 --> \r
<key>NSBluetoothAlwaysUsageDescription</key> \r
<string>App需要您的同意,才能访问蓝牙</string> \r
## 蓝牙相关接口\r
\r
```objective-c\r
-/// 配置SDK,每次连接上蓝牙设备后调用\r
-- (void)configSDK;\r
+/// 单利\r
++(AiIot *)shared;\r
+\r
+/// 开始鉴权\r
+- (void)startAuthentication;\r
\r
-/// 收到 蓝牙 数据\r
-/// - Parameter currData: 蓝牙数据\r
-- (void)handleReceivedData:(NSData *)data;\r
+/// 传输鉴权数据给sdk\r
+/// - Parameter data: 蓝牙设备传过来的数据\r
+- (void)sendAuthToSdk:(NSData *)data;\r
\r
-/// 断开设备调用结束工作\r
-/// - Parameter completed: 清理结束回调\r
-- (void)done:(void(^ _Nonnull )(id _Nullable param))completed;\r
+/// 传输业务数据给sdk\r
+/// - Parameter data:蓝牙设备传过来的数据\r
+- (void)sendBuinessToSdk:(NSData *)data;\r
```\r
\r
## 蓝牙相关代理\r
AliIotSDKCallbackProtocol\r
\r
```objective-c\r
-/// 响应数据,返回给上层调用\r
-/// - Parameters:\r
-/// - currData: 当前发出去的数据\r
-/// - device: 蓝牙设备 MAC\r
-/// - error: 先判断空,再发送出去\r
-- (void)handleSendData:(NSData *)currData toDevice:(NSData *)mac error:(NSError * _Nullable)error;\r
-\r
-@optional\r
-/// 初始化结果\r
-/// - Parameter isFinish: 是否完成初始化\r
-- (void)sdkInitResult:(BOOL)isFinish;\r
-\r
-/// 输出日志\r
-/// - Parameter log: 日志信息\r
-- (void)handleLog:(NSString *)log;\r
+/// 鉴权状态回调\r
+/// - Parameter isSuccess:是否鉴权成功\r
+- (void)aiIotSendAuthStatus:(BOOL)isSuccess;\r
+\r
+/// 鉴权数据回调,需要将此数据转发给蓝牙设备\r
+/// - Parameter data: 数据\r
+- (void)aiIotSendAuthData:(NSData *)data;\r
+\r
+/// 指令回调\r
+/// - Parameter data: 数据\r
+- (void)aiIotSendCmd:(NSData *)data;\r
+\r
+/// 录音回调\r
+/// - Parameter data: pcm格式语音数据\r
+- (void)aiIotSendRecordData:(NSData *)data;\r
```\r
\r
## 示例\r
- 设置代理\r
\r
```objective-c\r
- AliIot.shareInstance.delegate = self;\r
- AliIot.shareInstance.mapDelegate = self;\r
+ [AiIot shared].delegate = self;\r
```\r
-\r
\r
+- 鉴权\r
\r
-- 蓝牙连接成功后,需要与蓝牙设备协商MTU。所以必须注意是连接上蓝牙设备后再调用configSDK方法。\r
-\r
- ```objective-c\r
- //配置sdk\r
- - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {\r
- for (CBCharacteristic *characteristic in service.characteristics){\r
- if ([characteristic.UUID.UUIDString isEqualToString:@"FED7"]) {\r
- self.writeCha = characteristic;\r
- //找到写入的uuid后,调用sdk配置方法\r
- [AliIot.shareInstance configSDK];\r
- }\r
- if ([characteristic.UUID.UUIDString isEqualToString:@"FED8"]) {\r
- self.notifyCha = characteristic;\r
- [peripheral setNotifyValue:YES forCharacteristic:characteristic];\r
- }\r
- }\r
- }\r
```\r
-\r
-- 蓝牙连接断开后,必须调用done方法完成清理工作\r
-\r
- ```objective-c\r
- -(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{\r
- //蓝牙断开要调用该方法清理sdk数据\r
- [AliIot.shareInstance done:^(id _Nullable param) {\r
- \r
- }];\r
- }\r
+ [[AiIot shared] startAuthentication];\r
```\r
-\r
-- æ\94¶å\88°è\93\9dç\89\99设å¤\87ä¼ 过来的数据,传给sdk处理\r
+ \r
+- æ\94¶å\88°è®¾å¤\87ä¼ è¾\93过来的数据,传给sdk处理\r
\r
```objective-c\r
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {\r
- //收到蓝牙设备发送过来的数据,转发给sdk处理\r
- [AliIot.shareInstance handleReceivedData:characteristic.value];\r
+ NSData *data = characteristic.value;\r
+ if([characteristic.UUID.UUIDString isEqualToString:kAuthUUID]){\r
+ //鉴权的数据\r
+ [[AiIot shared] sendAuthToSdk:data];\r
+ }\r
+ else if([characteristic.UUID.UUIDString isEqualToString:kVoiceUUID]){\r
+ //语音数据\r
+ [[AiIot shared] sendBuinessToSdk:data];\r
+ }\r
}\r
```\r
\r
--- /dev/null
+
+
+#import <Foundation/Foundation.h>
+@interface AiAudioConverter : NSObject
+
+
+
+@end
--- /dev/null
+
+
+#import "AiAudioConverter.h"
+#import <Foundation/Foundation.h>
+#import <AudioToolbox/AudioToolbox.h>
+
+static void CheckError(OSStatus error, const char *operation)
+{
+ if (error == noErr) return;
+ char errorString[20];
+ // See if it appears to be a 4-char-code
+ *(UInt32 *)(errorString + 1) = CFSwapInt32HostToBig(error);
+ if (isprint(errorString[1]) && isprint(errorString[2]) && isprint(errorString[3]) && isprint(errorString[4])) {
+ errorString[0] = errorString[5] = '\'';
+ errorString[6] = '\0';
+ } else {
+ // No, format it as an integer
+ sprintf(errorString, "%d", (int)error);
+ fprintf(stderr, "Error: %s (%s)\n", operation, errorString);
+ }
+}
+
+
+//AudioConverterConvertBuffer
+@interface AiAudioConverter()
+
+//@property (nonatomic) AudioStreamBasicDescription inputFormat;
+//@property (nonatomic) AudioStreamBasicDescription *outputFormat;
+@end
+
+@implementation AiAudioConverter
+
+
+- (void)convert{
+
+ AudioStreamBasicDescription inFmt;
+ {
+ AudioStreamBasicDescription fmt = {};
+ fmt.mFormatID = kAudioFormatLinearPCM;
+ fmt.mSampleRate = 16000;
+ fmt.mChannelsPerFrame = 1;
+ fmt.mBitsPerChannel = 16;
+ fmt.mBytesPerPacket = 1 * sizeof(SInt16);
+ fmt.mBytesPerFrame = 1 * sizeof(SInt16);
+ fmt.mFramesPerPacket = 1;
+ fmt.mFormatFlags = kLinearPCMFormatFlagIsBigEndian | kLinearPCMFormatFlagIsSignedInteger;
+ inFmt = fmt;
+ }
+ AudioStreamBasicDescription *outFmt;
+// {
+// AudioStreamBasicDescription fmt = {};
+// fmt.mFormatID = kAudioFormatLinearPCM;
+// fmt.mSampleRate = 16000;
+// fmt.mChannelsPerFrame = 1;
+// fmt.mBitsPerChannel = 16;
+// fmt.mBytesPerPacket = 1 * sizeof(SInt16);
+// fmt.mBytesPerFrame = 1 * sizeof(SInt16);
+// fmt.mFramesPerPacket = 1;
+// fmt.mFormatFlags = kLinearPCMFormatFlagIsBigEndian | kLinearPCMFormatFlagIsSignedInteger;
+// outFmt = fmt;
+// }
+
+
+ AudioConverterRef audioConverter;
+ OSStatus status = AudioConverterNew(&inFmt,
+ outFmt,
+ &audioConverter);
+ CheckError(status, "AudioConveterNew failed");
+
+
+// AudioStreamPacketDescription outputPacketDesc;
+// status = AudioConverterFillComplexBuffer(audioConverter,
+// DecodeConverterComplexInputDataProc,
+// &userInfo,
+// &ioOutputDataPackets,
+// &fillBufferList,
+// &outputPacketDesc);
+//
+// // if interrupted in the process of the conversion call, we must handle the error appropriately
+// if (status != noErr) {
+// if (status == kAudioConverterErr_HardwareInUse) {
+// printf("Audio Converter returned kAudioConverterErr_HardwareInUse!\n");
+// } else {
+// if (![self checkError:status withErrorString:@"AudioConverterFillComplexBuffer error!"]) {
+// return;
+// }
+// }
+// } else {
+// if (ioOutputDataPackets == 0) {
+// // This is the EOF condition.
+// status = noErr;
+// }
+//
+// if (completeHandler) {
+// completeHandler(&fillBufferList, ioOutputDataPackets, &outputPacketDesc);
+// }
+// }
+}
+
+#pragma mark - Decode Callback
+//OSStatus DecodeConverterComplexInputDataProc(AudioConverterRef inAudioConverter,
+// UInt32 *ioNumberDataPackets,
+// AudioBufferList *ioData,
+// AudioStreamPacketDescription **outDataPacketDescription,
+// void *inUserData) {
+// XDXConverterInfoType *info = (XDXConverterInfoType *)inUserData;
+//
+// if (info->sourceDataSize <= 0) {
+// ioNumberDataPackets = 0;
+// return -1;
+// }
+//
+// *outDataPacketDescription = &info->packetDesc;
+// (*outDataPacketDescription)[0].mStartOffset = 0;
+// (*outDataPacketDescription)[0].mDataByteSize = info->sourceDataSize;
+// (*outDataPacketDescription)[0].mVariableFramesInPacket = 0;
+//
+// ioData->mNumberBuffers = 1;
+// ioData->mBuffers[0].mData = info->sourceBuffer;
+// ioData->mBuffers[0].mNumberChannels = info->sourceChannelsPerFrame;
+// ioData->mBuffers[0].mDataByteSize = info->sourceDataSize;
+//
+// return noErr;
+//}
+//-(AudioStreamBasicDescription)getAudioFormatWithFormatID:(UInt32)formatID sampleRate:(Float64)sampleRate channelCount:(UInt32)channelCount {
+// AudioStreamBasicDescription dataFormat = {0};
+//
+// UInt32 size = sizeof(dataFormat.mSampleRate);
+// // Get hardware origin sample rate. (Recommended it)
+// Float64 hardwareSampleRate = 0;
+// AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate,
+// &size,
+// &hardwareSampleRate);
+// // Manual set sample rate
+// dataFormat.mSampleRate = sampleRate;
+//
+// size = sizeof(dataFormat.mChannelsPerFrame);
+// // Get hardware origin channels number. (Must refer to it)
+// UInt32 hardwareNumberChannels = 0;
+// AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareInputNumberChannels,
+// &size,
+// &hardwareNumberChannels);
+// dataFormat.mChannelsPerFrame = channelCount;
+//
+// // Set audio format
+// dataFormat.mFormatID = formatID;
+//
+// // Set detail audio format params
+// if (formatID == kAudioFormatLinearPCM) {
+// dataFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
+// dataFormat.mBitsPerChannel = kXDXAudioPCMBitsPerChannel;
+// dataFormat.mBytesPerPacket = dataFormat.mBytesPerFrame = (dataFormat.mBitsPerChannel / 8) * dataFormat.mChannelsPerFrame;
+// dataFormat.mFramesPerPacket = kXDXAudioPCMFramesPerPacket;
+// }else if (formatID == kAudioFormatMPEG4AAC) {
+// dataFormat.mFormatFlags = kMPEG4Object_AAC_Main;
+// }
+//
+// NSLog(@"Audio Recorder: starup PCM audio encoder:%f,%d",sampleRate,channelCount);
+// return dataFormat;
+//}
+@end
NS_ASSUME_NONNULL_BEGIN
-@interface AiIotAudioDecoder : NSObject
+@interface AiAudioDecoder : NSObject
@property (nonatomic,copy) void(^onRecvPCMData)(NSData *pcmData);
-#import "AiIotAudioDecoder.h"
+#import "AiAudioDecoder.h"
#import <VideoToolbox/VideoToolbox.h>
#include "libavcodec/avcodec.h"
-@interface AiIotAudioDecoder (){
+@interface AiAudioDecoder (){
AVCodecContext *codecContext;
AVCodecParserContext *parserContext;
AVFrame *decodecAVFrame;
@property (assign, nonatomic) AVPacket *sbcPacket;
@property (assign, nonatomic)AVCodecParserContext *sbcParser;
@end
-@implementation AiIotAudioDecoder
+@implementation AiAudioDecoder
-static AiIotAudioDecoder *instance = nil;
+static AiAudioDecoder *instance = nil;
static dispatch_once_t onceToken;
+(id)sharedInstance
{
//
-// AiIotAudioManager.h
-// AiSdk
+// AiAudioManager.h
+// AiMouse
//
// Created by incar on 2024/2/28.
//
NS_ASSUME_NONNULL_BEGIN
-@interface AiIotAudioManager : NSObject
+@interface AiAudioManager : NSObject
@property (nonatomic,strong)void (^outputData)(NSData *data);
@property (nonatomic,strong)void (^audioRecordCallBack)(NSData *data);
@property (nonatomic,strong)void (^outputLog)(NSString *log);
//
-// AiIotAudioManager.m
-// AiSdk
+// AiAudioManager.m
+// AiMouse
//
// Created by incar on 2024/2/28.
//
-#import "AiIotAudioManager.h"
-#import "AiIotTools.h"
-#import "AiIotAudioDecoder.h"
+#import "AiAudioManager.h"
+#import "AiTools.h"
+#import "AiAudioDecoder.h"
-@interface AiIotAudioManager ()
-@property (nonatomic,strong)AiIotAudioDecoder *audioDecoder;
+@interface AiAudioManager ()
+@property (nonatomic,strong)AiAudioDecoder *audioDecoder;
@end
-@implementation AiIotAudioManager
+@implementation AiAudioManager
-(instancetype)init{
if (self = [super init]) {
- (void)receiveData:(NSData *)data{
[self.audioDecoder decodeSBCData:data];
-// NSString *str = [[AiIotTools dataToHexString:data] lowercaseString];
+// NSString *str = [[AiTools dataToHexString:data] lowercaseString];
// NSString *cmd = [str substringWithRange:NSMakeRange(0, 12)];
// if([cmd hasPrefix:@"0a"] && [cmd hasSuffix:@"31"]){
//// 0x0a6500002a3100020101c0c1a5a5a5a5
}
- (void)setupAudioDecoder{
- self.audioDecoder = [AiIotAudioDecoder sharedInstance];
+ self.audioDecoder = [AiAudioDecoder sharedInstance];
__weak typeof(self) ws = self;
self.audioDecoder.onRecvPCMData = ^(NSData * _Nonnull pcmData) {
-// [ws showLog:[NSString stringWithFormat:@"转换后数据%@",[AiIotTools dataToHexString:pcmData]]];
+// [ws showLog:[NSString stringWithFormat:@"转换后数据%@",[AiTools dataToHexString:pcmData]]];
if(ws.audioRecordCallBack)ws.audioRecordCallBack(pcmData);
};
[self.audioDecoder initSBCDecodec];
//
-// AiIotAuthManager.h
-// AiSdk
+// AiAuthManager.h
+// AiMouse
//
// Created by incar on 2024/2/28.
//
NS_ASSUME_NONNULL_BEGIN
-@interface AiIotAuthManager : NSObject
+@interface AiAuthManager : NSObject
@property (nonatomic,strong)void (^outputLog)(NSString *log);
@property (nonatomic,strong)void (^outputData)(NSData *data);
@property (nonatomic,strong)void (^authCallBack)(BOOL isSuccess);
//
-// AiIotAuthManager.m
-// AiSdk
+// AiAuthManager.m
+// AiMouse
//
// Created by incar on 2024/2/28.
//
-#import "AiIotAuthManager.h"
+#import "AiAuthManager.h"
#import <AliIotConnectKit/AliIotConnectKit.h>
-#import "AiIotTools.h"
-@interface AiIotAuthManager () <IotStateDelatege_C,BleNeedSendDataDelegate_C>
+#import "AiTools.h"
+@interface AiAuthManager () <IotStateDelatege_C,BleNeedSendDataDelegate_C>
@property (nonatomic, strong) dispatch_queue_t bizbus_connect_queue;
@property (nonatomic, strong) AliConnectMananger_C * bizbusManager;
@property (nonatomic, strong) AliCloudIotLogManager_C *bizbusLogManager;
@end
-@implementation AiIotAuthManager
+@implementation AiAuthManager
- (instancetype)init{
self = [super init];
if (self) {
- (void)onIotConnected {
[self showLog:@"LP连接成功。。。"];
- if(self.authCallBack)self.authCallBack(true);
+// if(self.authCallBack)self.authCallBack(true);
+ [self.bizbusManager disConnectWithResult:^(BOOL isSuccess, NSDictionary<NSString *,id> * _Nonnull msg) {
+ if(self.authCallBack)self.authCallBack(true);
+ }];
}
- (void)onIotDisconeted {
}
- (void)onLogWithLog:(NSString *)log {
- [self showLog:log];
+// [self showLog:[NSString stringWithFormat:@"[auth]%@",log]];
}
#pragma mark - BleNeedSendDataDelegate_C
- (void)sendBleDataWithData:(NSData * _Nonnull)data {
- [self showLog:[NSString stringWithFormat:@"[bizbus send json] %@",[AiIotTools dataToUtf8String:data]]];
+ [self showLog:[NSString stringWithFormat:@"[bizbus send json] %@",[AiTools dataToUtf8String:data]]];
__weak typeof(self) ws = self;
dispatch_async(_bizbus_connect_queue, ^{
-// NSMutableData *mData = NSMutableData.data;
-// uint8_t cmd = 0x41;
-// [mData appendBytes:&cmd length:1];
-// [mData appendData:data];
if (ws.outputData) ws.outputData(data);
});
}
#pragma mark - pub api
- (void)receiveData:(NSData *)data {
-// data = [data subdataWithRange:NSMakeRange(1, data.length -1)];
- [self showLog:[NSString stringWithFormat:@"[bizbus receive json] %@",[AiIotTools dataToUtf8String:data]]];
-// [self showLog:[NSString stringWithFormat:@"[bizbus receive bytes] %@",[AiIotTools dataToHexString:data]]];
+ [self showLog:[NSString stringWithFormat:@"[bizbus receive json] %@",[AiTools dataToUtf8String:data]]];
__weak typeof(self) ws = self;
dispatch_async(_bizbus_connect_queue, ^{
[ws.bizbusManager bleDataReceivedWithData:data];
dispatch_async(_bizbus_connect_queue, ^{
/// 请求飞鸽书
[ws.bizbusManager checkFgsStateWithResult:^(BOOL isSuccess, NSDictionary<NSString *,id> * _Nonnull msg) {
-// [ws showLog:[NSString stringWithFormat:@"checkFgsState %@",[msg tysm_jsonStringEncoded]]];
- // 飞鸽书请求失败不再执行后续连接
if (isSuccess == NO) {
-// if (ws.stateBlock) weak_self.stateBlock(AliIotSDKBizbusState_FGS_FAILED);
+ if(ws.authCallBack)ws.authCallBack(false);
}
else {
-// if (ws.stateBlock) ws.stateBlock(AliIotSDKBizbusState_FGS_SUCCESS);
/// 连接 LP
[ws.bizbusManager startConnectLpStateWithResult:^(BOOL isSuccess, NSDictionary<NSString *,id> * _Nonnull msg) {
if (isSuccess == NO) {
-// if (ws.stateBlock) {
-// ws.stateBlock(AliIotSDKBizbusState_FND_FAILED);
-// [ws.bizbusManager disConnectWithResult:^(BOOL isSuccess, NSDictionary<NSString *,id> * _Nonnull msg) {
-// if (isSuccess == YES) [ws connect];
-// }];
-// };
+ if(ws.authCallBack)ws.authCallBack(false);
} else {
-// if (ws.stateBlock) weak_self.stateBlock(AliIotSDKBizbusState_FND_SUCCESS);
+// [ws.bizbusManager disConnectWithResult:^(BOOL isSuccess, NSDictionary<NSString *,id> * _Nonnull msg) {
+// if(ws.authCallBack)ws.authCallBack(true);
+// }];
}
}];
}
#pragma mark -others
- (void)showLog:(NSString *)log {
- if (self.outputLog) self.outputLog(log);
+ if (self.outputLog) self.outputLog([NSString stringWithFormat:@"[auth]%@",log]);
}
- (void)disconnect {
__weak typeof(self) ws = self;
--- /dev/null
+//
+// AiFrameManager.h
+// AiMouse
+//
+// Created by incar on 2024/3/7.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface AiFrameManager : NSObject
+@property (nonatomic,strong)void (^didReceiveFullData)(NSData *data);/// 输出接收完整的一个数据包
+
+/// 接收到数据帧
+- (void)didReceiveFrameData:(NSData *)data;
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// AiFrameManager.m
+// AiMouse
+//
+// Created by incar on 2024/3/7.
+//
+
+#import "AiFrameManager.h"
+#import "AiTools.h"
+@interface AiFrameManager()
+
+@property (nonatomic,strong)NSMutableData *recvData;
+@end
+
+@implementation AiFrameManager
+- (void)didReceiveFrameData:(NSData *)data{
+ NSString *str = [AiTools dataToUtf8String:data];
+ if ([str isEqualTo:@"-$$"]) {
+ //开始
+ self.recvData = [[NSMutableData alloc] init];
+ }
+ else if([str isEqualTo:@"$$-\n"]){
+ //结束
+ if(self.didReceiveFullData){
+ self.didReceiveFullData(self.recvData);
+ }
+ }
+ else{
+ //数据
+ [self.recvData appendData:data];
+ }
+}
+@end
--- /dev/null
+//
+// Ai.h
+// AiMouse
+//
+// Created by incar on 2024/2/28.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol AiMouseDelegate <NSObject>
+
+/// 鉴权状态回调
+/// - Parameter isSuccess:是否鉴权成功
+- (void)aiMouseAuthCallBack:(BOOL)isSuccess;
+
+/// 鉴权数据回调,需要将此数据转发给蓝牙设备
+/// - Parameter data: 数据
+- (void)aiMouseSendAuthData:(NSData *)data;
+
+/// 鼠标按键指令回调
+/// - Parameter data: 数据。AI键0x42单击,0x25按下,0x26抬起 ; 录音键0x51单击,0x32按下。0x31(未知),其他未知
+- (void)aiMouseSendCmdData:(NSData *)data;
+
+/// 录音回调
+/// - Parameter data: pcm格式语音数据
+- (void)aiMouseSendRecordData:(NSData *)data;
+
+@end
+
+@interface AiMouse : NSObject
+@property (nonatomic, weak) id<AiMouseDelegate> delegate;/// 代理
+
+/// 单利
++(AiMouse *)shared;
+
+/// 开始鉴权
+- (void)startAuthentication;
+
+/// 传输鉴权数据给sdk
+/// - Parameter data: 鉴权特征传过来的数据
+- (void)sendAuthDataToSdk:(NSData *)data;
+
+/// 传输业务数据给sdk
+/// - Parameter data:ai特征传过来的数据
+- (void)sendAiDataToSdk:(NSData *)data;
+@end
+
+NS_ASSUME_NONNULL_END
//
-// AiIot.m
-// AiSdk
+// Ai.m
+// AiMouse
//
// Created by incar on 2024/2/28.
//
-#import "AiIot.h"
-#import "AiIotAuthManager.h"
-#import "AiIotAudioManager.h"
-#import "AiIotTools.h"
-@interface AiIot()
+#import "AiMouse.h"
+#import "AiFrameManager.h"
+#import "AiAuthManager.h"
+#import "AiAudioManager.h"
+#import "AiTools.h"
+@interface AiMouse()
-@property (nonatomic, strong) AiIotAuthManager *authManager;
-@property (nonatomic, strong) AiIotAudioManager *audioManager;
+@property (nonatomic, strong) AiFrameManager *frameManager;
+@property (nonatomic, strong) AiAuthManager *authManager;
+@property (nonatomic, strong) AiAudioManager *audioManager;
@end
-@implementation AiIot
-+(AiIot *)shared{
- static AiIot *manager = nil;
+@implementation AiMouse
++(AiMouse *)shared{
+ static AiMouse *manager = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
- manager = [[AiIot alloc]init];
+ manager = [[AiMouse alloc]init];
});
return manager;
}
+-(AiFrameManager *)frameManager{
+ if (!_frameManager) {
+ _frameManager = [[AiFrameManager alloc] init];
+ __weak typeof(self) ws = self;
+ _frameManager.didReceiveFullData = ^(NSData * _Nonnull data) {
+ [ws.authManager receiveData:data];
+ };
+ }
+ return _frameManager;
+}
--(AiIotAuthManager *)authManager{
+-(AiAuthManager *)authManager{
if (!_authManager) {
- _authManager = [[AiIotAuthManager alloc] init];
+ _authManager = [[AiAuthManager alloc] init];
__weak typeof(self) ws = self;
_authManager.outputLog = ^(NSString * _Nonnull log) {
[ws showLog:log];
};
_authManager.authCallBack = ^(BOOL isSuccess) {
if (ws.delegate) {
- [ws.delegate aiIotSendAuthStatus:isSuccess];
+ [ws.delegate aiMouseAuthCallBack:isSuccess];
}
};
}
return _authManager;
}
--(AiIotAudioManager *)audioManager{
+-(AiAudioManager *)audioManager{
if (!_audioManager) {
- _audioManager = [[AiIotAudioManager alloc] init];
+ _audioManager = [[AiAudioManager alloc] init];
__weak typeof(self) ws = self;
_audioManager.audioRecordCallBack = ^(NSData * _Nonnull data) {
[ws sendRecordData:data];
}
//接收到设备传过来的数据
-- (void)sendAuthToSdk:(NSData *)data{
- [self.authManager receiveData:data];
+- (void)sendAuthDataToSdk:(NSData *)data{
+ [self.frameManager didReceiveFrameData:data];
}
-- (void)sendBuinessToSdk:(NSData *)data{
- NSString *str = [[AiIotTools dataToHexString:data] lowercaseString];
+- (void)sendAiDataToSdk:(NSData *)data{
+ NSString *str = [[AiTools dataToHexString:data] lowercaseString];
NSString *cmd = [str substringWithRange:NSMakeRange(0, 12)];
-
- if(([cmd hasPrefix:@"0a"] && ([cmd hasSuffix:@"31"] || [cmd hasSuffix:@"32"]))){
- //开始录音,结束录音
- [self sendCmdData:data];
+// 0A65004E003200010101C0C10000A5A5
+ if(data.length == 16){
+ NSData *cmd = [data subdataWithRange:NSMakeRange(5, 1)];
+ [self sendCmdData:cmd];
}
- if([cmd hasPrefix:@"9c31"]){
+ else if([cmd hasPrefix:@"9c31"]){
//声音
[self.audioManager receiveData:data];
- }
- else if([str isEqual:@"000401"]){
-
}
else{
[self showLog:@"未实现指令"];
}
-// uint8_t cmdType = 0x00;
-// switch (cmdType) {
-// case 0x00:
-// [self.authManager receiveData:data];
-// break;
-// case 0x01:
-// [self.audioManager receiveData:data];
-// break;
-// default:
-// break;
-// }
}
#pragma mark - other
- (void)sendAuthData:(NSData *)data{
if (self.delegate) {
- [self.delegate aiIotSendAuthData:data];
+ [self.delegate aiMouseSendAuthData:data];
}
}
- (void)sendRecordData:(NSData *)data{
if (self.delegate) {
- [self.delegate aiIotSendRecordData:data];
+ [self.delegate aiMouseSendRecordData:data];
}
}
- (void)sendCmdData:(NSData *)data{
if (self.delegate) {
- [self.delegate aiIotSendCmd:data];
+ [self.delegate aiMouseSendCmdData:data];
}
}
- (void)showLog:(NSString *)log{
- (void)sendTestLP{
NSString *cmd = @"7B22736964223A22464753222C22766572223A312C2264617461223A227B5C227369647665725C223A312C5C226D73675F747970655C223A5C224647535F4D53475F545950455F53544152545F4647535F5245515C227D227D";
- NSData *data = [AiIotTools hexStringToData:cmd];
+ NSData *data = [AiTools hexStringToData:cmd];
[self sendAuthData:data];
}
@end
--- /dev/null
+//
+// AiMouse.h
+// AiMouse
+//
+// Created by incar on 2024/2/19.
+//
+
+#import <Foundation/Foundation.h>
+
+//! Project version number for AiMouse.
+FOUNDATION_EXPORT double AiMouseVersionNumber;
+
+//! Project version string for AiMouse.
+FOUNDATION_EXPORT const unsigned char AiMouseVersionString[];
+
+// 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>
//
-// AiIotTools.h
-// AiSdk
+// AiTools.h
+// AiMouse
//
// Created by incar on 2024/2/28.
//
NS_ASSUME_NONNULL_BEGIN
-@interface AiIotTools : NSObject
+@interface AiTools : NSObject
+ (NSArray *)stringToArray:(NSString *)jsonString;
+ (NSString *)arrayToString:(NSArray *)arr;
//
-// AiIotTools.m
-// AiSdk
+// AiTools.m
+// AiMouse
//
// Created by incar on 2024/2/28.
//
-#import "AiIotTools.h"
+#import "AiTools.h"
-@implementation AiIotTools
+@implementation AiTools
+ (NSArray *)stringToArray:(NSString *)jsonString{
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
+++ /dev/null
-//
-// AiIot.h
-// AiSdk
-//
-// Created by incar on 2024/2/28.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@protocol AiIotDelegate <NSObject>
-
-/// 鉴权状态回调
-/// - Parameter isSuccess:是否鉴权成功
-- (void)aiIotSendAuthStatus:(BOOL)isSuccess;
-
-/// 鉴权数据回调,需要将此数据转发给蓝牙设备
-/// - Parameter data: 数据
-- (void)aiIotSendAuthData:(NSData *)data;
-
-/// 指令回调
-/// - Parameter data: 数据
-- (void)aiIotSendCmd:(NSData *)data;
-
-/// 录音回调
-/// - Parameter data: pcm格式语音数据
-- (void)aiIotSendRecordData:(NSData *)data;
-
-@end
-
-@interface AiIot : NSObject
-@property (nonatomic, weak) id<AiIotDelegate> delegate;/// 代理
-
-/// 单利
-+(AiIot *)shared;
-
-/// 开始鉴权
-- (void)startAuthentication;
-
-/// 传输鉴权数据给sdk
-/// - Parameter data: 蓝牙设备传过来的数据
-- (void)sendAuthToSdk:(NSData *)data;
-
-/// 传输业务数据给sdk
-/// - Parameter data:蓝牙设备传过来的数据
-- (void)sendBuinessToSdk:(NSData *)data;
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-//
-//#import <Foundation/Foundation.h>
-//@interface AiIotAudioConverter : NSObject
-//
-//
-//
-//@end
+++ /dev/null
-//
-//
-//#import "AiIotAudioConverter.h"
-//#import <Foundation/Foundation.h>
-//#import <AudioToolbox/AudioToolbox.h>
-//
-//static void CheckError(OSStatus error, const char *operation)
-//{
-// if (error == noErr) return;
-// char errorString[20];
-// // See if it appears to be a 4-char-code
-// *(UInt32 *)(errorString + 1) = CFSwapInt32HostToBig(error);
-// if (isprint(errorString[1]) && isprint(errorString[2]) && isprint(errorString[3]) && isprint(errorString[4])) {
-// errorString[0] = errorString[5] = '\'';
-// errorString[6] = '\0';
-// } else {
-// // No, format it as an integer
-// sprintf(errorString, "%d", (int)error);
-// fprintf(stderr, "Error: %s (%s)\n", operation, errorString);
-// }
-//}
-//
-//
-////AudioConverterConvertBuffer
-//@interface AiIotAudioConverter()
-//
-//@property (nonatomic) AudioStreamBasicDescription inputFormat;
-//@property (nonatomic) AudioStreamBasicDescription *outputFormat;
-//@end
-//
-//@implementation AiIotAudioConverter
-//
-//
-//- (void)convert{
-//
-// AudioStreamBasicDescription mSourceFormat;
-//
-// {
-// AudioStreamBasicDescription dataFormat = {};
-// dataFormat.mFormatID = kAudioFormatLinearPCM;
-// dataFormat.mSampleRate = 16000;
-// dataFormat.mChannelsPerFrame = 1;
-// dataFormat.mBitsPerChannel = 16;
-// dataFormat.mBytesPerPacket = 1 * sizeof(SInt16);
-// dataFormat.mBytesPerFrame = 1 * sizeof(SInt16);
-// dataFormat.mFramesPerPacket = 1;
-// dataFormat.mFormatFlags = kLinearPCMFormatFlagIsBigEndian | kLinearPCMFormatFlagIsSignedInteger;
-// self.outputFormat = &(dataFormat);
-// }
-//
-//
-// AudioConverterRef audioConverter;
-// OSStatus status = AudioConverterNew(&_inputFormat,
-// _outputFormat,
-// &audioConverter);
-// CheckError(status, "AudioConveterNew failed");
-//
-//
-// AudioStreamPacketDescription outputPacketDesc;
-// status = AudioConverterFillComplexBuffer(audioConverter,
-// DecodeConverterComplexInputDataProc,
-// &userInfo,
-// &ioOutputDataPackets,
-// &fillBufferList,
-// &outputPacketDesc);
-//
-// // if interrupted in the process of the conversion call, we must handle the error appropriately
-// if (status != noErr) {
-// if (status == kAudioConverterErr_HardwareInUse) {
-// printf("Audio Converter returned kAudioConverterErr_HardwareInUse!\n");
-// } else {
-// if (![self checkError:status withErrorString:@"AudioConverterFillComplexBuffer error!"]) {
-// return;
-// }
-// }
-// } else {
-// if (ioOutputDataPackets == 0) {
-// // This is the EOF condition.
-// status = noErr;
-// }
-//
-// if (completeHandler) {
-// completeHandler(&fillBufferList, ioOutputDataPackets, &outputPacketDesc);
-// }
-// }
-//}
-//
-//#pragma mark - Decode Callback
-//OSStatus DecodeConverterComplexInputDataProc(AudioConverterRef inAudioConverter,
-// UInt32 *ioNumberDataPackets,
-// AudioBufferList *ioData,
-// AudioStreamPacketDescription **outDataPacketDescription,
-// void *inUserData) {
-// XDXConverterInfoType *info = (XDXConverterInfoType *)inUserData;
-//
-// if (info->sourceDataSize <= 0) {
-// ioNumberDataPackets = 0;
-// return -1;
-// }
-//
-// *outDataPacketDescription = &info->packetDesc;
-// (*outDataPacketDescription)[0].mStartOffset = 0;
-// (*outDataPacketDescription)[0].mDataByteSize = info->sourceDataSize;
-// (*outDataPacketDescription)[0].mVariableFramesInPacket = 0;
-//
-// ioData->mNumberBuffers = 1;
-// ioData->mBuffers[0].mData = info->sourceBuffer;
-// ioData->mBuffers[0].mNumberChannels = info->sourceChannelsPerFrame;
-// ioData->mBuffers[0].mDataByteSize = info->sourceDataSize;
-//
-// return noErr;
-//}
-////-(AudioStreamBasicDescription)getAudioFormatWithFormatID:(UInt32)formatID sampleRate:(Float64)sampleRate channelCount:(UInt32)channelCount {
-//// AudioStreamBasicDescription dataFormat = {0};
-////
-//// UInt32 size = sizeof(dataFormat.mSampleRate);
-//// // Get hardware origin sample rate. (Recommended it)
-//// Float64 hardwareSampleRate = 0;
-//// AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate,
-//// &size,
-//// &hardwareSampleRate);
-//// // Manual set sample rate
-//// dataFormat.mSampleRate = sampleRate;
-////
-//// size = sizeof(dataFormat.mChannelsPerFrame);
-//// // Get hardware origin channels number. (Must refer to it)
-//// UInt32 hardwareNumberChannels = 0;
-//// AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareInputNumberChannels,
-//// &size,
-//// &hardwareNumberChannels);
-//// dataFormat.mChannelsPerFrame = channelCount;
-////
-//// // Set audio format
-//// dataFormat.mFormatID = formatID;
-////
-//// // Set detail audio format params
-//// if (formatID == kAudioFormatLinearPCM) {
-//// dataFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
-//// dataFormat.mBitsPerChannel = kXDXAudioPCMBitsPerChannel;
-//// dataFormat.mBytesPerPacket = dataFormat.mBytesPerFrame = (dataFormat.mBitsPerChannel / 8) * dataFormat.mChannelsPerFrame;
-//// dataFormat.mFramesPerPacket = kXDXAudioPCMFramesPerPacket;
-//// }else if (formatID == kAudioFormatMPEG4AAC) {
-//// dataFormat.mFormatFlags = kMPEG4Object_AAC_Main;
-//// }
-////
-//// NSLog(@"Audio Recorder: starup PCM audio encoder:%f,%d",sampleRate,channelCount);
-//// return dataFormat;
-////}
-//@end
+++ /dev/null
-//
-// AiSdk.h
-// AiSdk
-//
-// Created by incar on 2024/2/19.
-//
-
-#import <Foundation/Foundation.h>
-
-//! Project version number for AiSdk.
-FOUNDATION_EXPORT double AiSdkVersionNumber;
-
-//! Project version string for AiSdk.
-FOUNDATION_EXPORT const unsigned char AiSdkVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import <AiSdk/PublicHeader.h>
-
-#import <AiSdk/AiIot.h>
-#import <AiSdk/AiIotTools.h>
// __weak typeof(self) weak_self = self;\r
\r
[[IotMQTT shareInstance] setConnectStatusCallback:^(MqttConnectStatus_C ConnectStatus) {\r
- NSLog(@"---------------connect status :%lu", ConnectStatus);\r
+// NSLog(@"---------------connect status :%lu", ConnectStatus);\r
// if (weak_self.DebugAddrBlock)\r
MqttManager_C.sharedInstance.DebugAddrBlock(@{@"mqtt addr": IotMQTT.shareInstance,\r
@"mqtt mgr addr " : [NSString stringWithFormat:@"%@ - %@", MqttManager_C.sharedInstance, MqttManager_C.sharedInstance]\r
}];\r
\r
[[IotMQTT shareInstance] setMessageArrivalCallback:^(NSString * _Nonnull topic, NSString * _Nonnull payload) {\r
- NSLog(@"---------topic :%@", topic);\r
- NSLog(@"payload :%@", payload);\r
+// NSLog(@"---------topic :%@", topic);\r
+// NSLog(@"payload :%@", payload);\r
\r
MqttManager_C.sharedInstance.DebugAddrBlock(@{@"mqtt addr": IotMQTT.shareInstance,\r
@"mqtt mgr addr " : [NSString stringWithFormat:@"%@ - %@", MqttManager_C.sharedInstance, MqttManager_C.sharedInstance]\r
objects = {
/* Begin PBXBuildFile section */
+ 18AE9CE02B99C72000743515 /* AiMouse.h in Headers */ = {isa = PBXBuildFile; fileRef = 18AE9CDE2B99C71F00743515 /* AiMouse.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 18AE9CE12B99C72000743515 /* AiMouse.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AE9CDF2B99C71F00743515 /* AiMouse.m */; };
18BF1DCF2B81AB7C00B8D90F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 18BF1DCE2B81AB7C00B8D90F /* AppDelegate.m */; };
18BF1DD22B81AB7C00B8D90F /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18BF1DD12B81AB7C00B8D90F /* ViewController.m */; };
18BF1DD42B81AB7F00B8D90F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 18BF1DD32B81AB7F00B8D90F /* Assets.xcassets */; };
18BF1E052B81E18800B8D90F /* ConnectKitVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18BF1E042B81E18800B8D90F /* ConnectKitVC.swift */; };
18BF1E222B83066200B8D90F /* BleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18BF1E212B83066200B8D90F /* BleManager.m */; };
18BF1E762B832D2E00B8D90F /* ScanVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 18BF1E752B832D2E00B8D90F /* ScanVC.m */; };
- 18BF1E8A2B8362D300B8D90F /* AiSdk.h in Headers */ = {isa = PBXBuildFile; fileRef = 18BF1E892B8362D300B8D90F /* AiSdk.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 18BF1E8D2B8362D300B8D90F /* AiSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF1E872B8362D300B8D90F /* AiSdk.framework */; };
- 18BF1E8E2B8362D300B8D90F /* AiSdk.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF1E872B8362D300B8D90F /* AiSdk.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 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, ); }; };
18F3235D2B8ED78300CABA2E /* ScanCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F3235C2B8ED78300CABA2E /* ScanCell.m */; };
- 18F323672B8F1C1900CABA2E /* AiIot.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F323652B8F1C1900CABA2E /* AiIot.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 18F323682B8F1C1900CABA2E /* AiIot.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323662B8F1C1900CABA2E /* AiIot.m */; };
18F323772B8F2DAD00CABA2E /* AliIotTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323752B8F2DAC00CABA2E /* AliIotTools.m */; };
18F3237F2B8F30B200CABA2E /* AliIotConnectKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18F3237D2B8F2EFC00CABA2E /* AliIotConnectKit.framework */; };
18F323802B8F30B200CABA2E /* AliIotConnectKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 18F3237D2B8F2EFC00CABA2E /* AliIotConnectKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 18F323842B8F330100CABA2E /* AiIotAuthManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F323822B8F330100CABA2E /* AiIotAuthManager.h */; };
- 18F323852B8F330100CABA2E /* AiIotAuthManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323832B8F330100CABA2E /* AiIotAuthManager.m */; };
+ 18F323842B8F330100CABA2E /* AiAuthManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F323822B8F330100CABA2E /* AiAuthManager.h */; };
+ 18F323852B8F330100CABA2E /* AiAuthManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323832B8F330100CABA2E /* AiAuthManager.m */; };
18F323872B8F338300CABA2E /* AliIotConnectKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18F3237D2B8F2EFC00CABA2E /* AliIotConnectKit.framework */; };
18F3238A2B8F4DBE00CABA2E /* PCMPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323892B8F4DBE00CABA2E /* PCMPlayer.m */; };
- 18F3238E2B8F4F7300CABA2E /* AiIotAudioManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F3238C2B8F4F7300CABA2E /* AiIotAudioManager.h */; };
- 18F3238F2B8F4F7300CABA2E /* AiIotAudioManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F3238D2B8F4F7300CABA2E /* AiIotAudioManager.m */; };
- 18F323952B8F525C00CABA2E /* AiIotTools.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F323932B8F525C00CABA2E /* AiIotTools.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 18F323962B8F525C00CABA2E /* AiIotTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323942B8F525C00CABA2E /* AiIotTools.m */; };
- 18F323A82B9095D300CABA2E /* AiIotAudioConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F323A62B9095D300CABA2E /* AiIotAudioConverter.h */; };
- 18F323A92B9095D300CABA2E /* AiIotAudioConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323A72B9095D300CABA2E /* AiIotAudioConverter.m */; };
- 18F323C42B93352000CABA2E /* AiIotAudioDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F323C22B93352000CABA2E /* AiIotAudioDecoder.h */; };
- 18F323C52B93352000CABA2E /* AiIotAudioDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323C32B93352000CABA2E /* AiIotAudioDecoder.m */; };
+ 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 */; };
+ 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 */; };
+ 18F323C52B93352000CABA2E /* AiAudioDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F323C32B93352000CABA2E /* AiAudioDecoder.m */; };
18F3249E2B9337D500CABA2E /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 18F3249D2B9337D500CABA2E /* libz.tbd */; };
18F324A22B93381C00CABA2E /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 18F324A12B93381C00CABA2E /* libbz2.tbd */; };
18F324A42B93382900CABA2E /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 18F324A32B93382900CABA2E /* libiconv.tbd */; };
18F328B82B970B4000CABA2E /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 18F327F22B970B3F00CABA2E /* libssl.a */; };
18F328B92B970B4000CABA2E /* libswscale.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 18F327F32B970B3F00CABA2E /* libswscale.a */; };
18F328D52B98569D00CABA2E /* Config.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F328D42B98569D00CABA2E /* Config.m */; };
+ 18F328DE2B9950E000CABA2E /* AiFrameManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F328DC2B9950E000CABA2E /* AiFrameManager.h */; };
+ 18F328DF2B9950E000CABA2E /* AiFrameManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F328DD2B9950E000CABA2E /* AiFrameManager.m */; };
8A6657BD1406314D4CBB7CEF /* libPods-MouseSdk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0311DF3AD67ED792549B96BD /* libPods-MouseSdk.a */; };
/* End PBXBuildFile section */
dstSubfolderSpec = 10;
files = (
18F323802B8F30B200CABA2E /* AliIotConnectKit.framework in Embed Frameworks */,
- 18BF1E8E2B8362D300B8D90F /* AiSdk.framework in Embed Frameworks */,
+ 18BF1E8E2B8362D300B8D90F /* AiMouseSdk.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
/* Begin PBXFileReference section */
0311DF3AD67ED792549B96BD /* libPods-MouseSdk.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-MouseSdk.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 18AE9CDE2B99C71F00743515 /* AiMouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AiMouse.h; sourceTree = "<group>"; };
+ 18AE9CDF2B99C71F00743515 /* AiMouse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AiMouse.m; sourceTree = "<group>"; };
18BF1DCA2B81AB7C00B8D90F /* MouseSdk.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MouseSdk.app; sourceTree = BUILT_PRODUCTS_DIR; };
18BF1DCD2B81AB7C00B8D90F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
18BF1DCE2B81AB7C00B8D90F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
18BF1E212B83066200B8D90F /* BleManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BleManager.m; sourceTree = "<group>"; };
18BF1E742B832D2E00B8D90F /* ScanVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ScanVC.h; sourceTree = "<group>"; };
18BF1E752B832D2E00B8D90F /* ScanVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScanVC.m; sourceTree = "<group>"; };
- 18BF1E872B8362D300B8D90F /* AiSdk.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AiSdk.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 18BF1E892B8362D300B8D90F /* AiSdk.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiSdk.h; 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>"; };
18F3235B2B8ED78300CABA2E /* ScanCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ScanCell.h; sourceTree = "<group>"; };
18F3235C2B8ED78300CABA2E /* ScanCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScanCell.m; sourceTree = "<group>"; };
- 18F323652B8F1C1900CABA2E /* AiIot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiIot.h; sourceTree = "<group>"; };
- 18F323662B8F1C1900CABA2E /* AiIot.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiIot.m; sourceTree = "<group>"; };
18F323752B8F2DAC00CABA2E /* AliIotTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AliIotTools.m; sourceTree = "<group>"; };
18F323762B8F2DAD00CABA2E /* AliIotTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AliIotTools.h; sourceTree = "<group>"; };
18F323782B8F2EFB00CABA2E /* AliIotConnectKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = AliIotConnectKit.xcodeproj; path = AliIotConnectKitSDK/AliIotConnectKit.xcodeproj; sourceTree = "<group>"; };
- 18F323822B8F330100CABA2E /* AiIotAuthManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiIotAuthManager.h; sourceTree = "<group>"; };
- 18F323832B8F330100CABA2E /* AiIotAuthManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiIotAuthManager.m; sourceTree = "<group>"; };
+ 18F323822B8F330100CABA2E /* AiAuthManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiAuthManager.h; sourceTree = "<group>"; };
+ 18F323832B8F330100CABA2E /* AiAuthManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiAuthManager.m; sourceTree = "<group>"; };
18F323882B8F4DBE00CABA2E /* PCMPlayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PCMPlayer.h; sourceTree = "<group>"; };
18F323892B8F4DBE00CABA2E /* PCMPlayer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PCMPlayer.m; sourceTree = "<group>"; };
- 18F3238C2B8F4F7300CABA2E /* AiIotAudioManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiIotAudioManager.h; sourceTree = "<group>"; };
- 18F3238D2B8F4F7300CABA2E /* AiIotAudioManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiIotAudioManager.m; sourceTree = "<group>"; };
- 18F323932B8F525C00CABA2E /* AiIotTools.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiIotTools.h; sourceTree = "<group>"; };
- 18F323942B8F525C00CABA2E /* AiIotTools.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiIotTools.m; sourceTree = "<group>"; };
- 18F323A62B9095D300CABA2E /* AiIotAudioConverter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiIotAudioConverter.h; sourceTree = "<group>"; };
- 18F323A72B9095D300CABA2E /* AiIotAudioConverter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiIotAudioConverter.m; sourceTree = "<group>"; };
- 18F323C22B93352000CABA2E /* AiIotAudioDecoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiIotAudioDecoder.h; sourceTree = "<group>"; };
- 18F323C32B93352000CABA2E /* AiIotAudioDecoder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiIotAudioDecoder.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>"; };
+ 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>"; };
+ 18F323C32B93352000CABA2E /* AiAudioDecoder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiAudioDecoder.m; sourceTree = "<group>"; };
18F3249D2B9337D500CABA2E /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
18F3249F2B9337E400CABA2E /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
18F324A12B93381C00CABA2E /* libbz2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libbz2.tbd; path = usr/lib/libbz2.tbd; sourceTree = SDKROOT; };
18F327F32B970B3F00CABA2E /* libswscale.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libswscale.a; sourceTree = "<group>"; };
18F328D32B98569D00CABA2E /* Config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Config.h; sourceTree = "<group>"; };
18F328D42B98569D00CABA2E /* Config.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Config.m; sourceTree = "<group>"; };
+ 18F328DC2B9950E000CABA2E /* AiFrameManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiFrameManager.h; sourceTree = "<group>"; };
+ 18F328DD2B9950E000CABA2E /* AiFrameManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiFrameManager.m; sourceTree = "<group>"; };
51DE1118FCBA78EBEE6FE2CD /* Pods-MouseSdk.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MouseSdk.release.xcconfig"; path = "Target Support Files/Pods-MouseSdk/Pods-MouseSdk.release.xcconfig"; sourceTree = "<group>"; };
811936622867478806C1A8BB /* Pods-MouseSdk.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MouseSdk.debug.xcconfig"; path = "Target Support Files/Pods-MouseSdk/Pods-MouseSdk.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
files = (
18F3237F2B8F30B200CABA2E /* AliIotConnectKit.framework in Frameworks */,
8A6657BD1406314D4CBB7CEF /* libPods-MouseSdk.a in Frameworks */,
- 18BF1E8D2B8362D300B8D90F /* AiSdk.framework in Frameworks */,
+ 18BF1E8D2B8362D300B8D90F /* AiMouseSdk.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
18BF1DCC2B81AB7C00B8D90F /* MouseSdk */,
18BF1DE22B81AB8000B8D90F /* MouseSdkTests */,
18BF1DEC2B81AB8000B8D90F /* MouseSdkUITests */,
- 18BF1E882B8362D300B8D90F /* AiSdk */,
+ 18BF1E882B8362D300B8D90F /* AiMouseSdk */,
18BF1DCB2B81AB7C00B8D90F /* Products */,
723588BAA058E1012143D29F /* Pods */,
543EC4E5F9FC310D6B850947 /* Frameworks */,
18BF1DCA2B81AB7C00B8D90F /* MouseSdk.app */,
18BF1DDF2B81AB8000B8D90F /* MouseSdkTests.xctest */,
18BF1DE92B81AB8000B8D90F /* MouseSdkUITests.xctest */,
- 18BF1E872B8362D300B8D90F /* AiSdk.framework */,
+ 18BF1E872B8362D300B8D90F /* AiMouseSdk.framework */,
);
name = Products;
sourceTree = "<group>";
path = Ble;
sourceTree = "<group>";
};
- 18BF1E882B8362D300B8D90F /* AiSdk */ = {
+ 18BF1E882B8362D300B8D90F /* AiMouseSdk */ = {
isa = PBXGroup;
children = (
18F327212B970B3E00CABA2E /* ffmpeg */,
- 18BF1E892B8362D300B8D90F /* AiSdk.h */,
- 18F323652B8F1C1900CABA2E /* AiIot.h */,
- 18F323662B8F1C1900CABA2E /* AiIot.m */,
- 18F323932B8F525C00CABA2E /* AiIotTools.h */,
- 18F323942B8F525C00CABA2E /* AiIotTools.m */,
- 18F3238C2B8F4F7300CABA2E /* AiIotAudioManager.h */,
- 18F3238D2B8F4F7300CABA2E /* AiIotAudioManager.m */,
- 18F323822B8F330100CABA2E /* AiIotAuthManager.h */,
- 18F323832B8F330100CABA2E /* AiIotAuthManager.m */,
- 18F323A62B9095D300CABA2E /* AiIotAudioConverter.h */,
- 18F323A72B9095D300CABA2E /* AiIotAudioConverter.m */,
- 18F323C22B93352000CABA2E /* AiIotAudioDecoder.h */,
- 18F323C32B93352000CABA2E /* AiIotAudioDecoder.m */,
+ 18BF1E892B8362D300B8D90F /* AiMouseSdk.h */,
+ 18AE9CDE2B99C71F00743515 /* AiMouse.h */,
+ 18AE9CDF2B99C71F00743515 /* AiMouse.m */,
+ 18F328DC2B9950E000CABA2E /* AiFrameManager.h */,
+ 18F328DD2B9950E000CABA2E /* AiFrameManager.m */,
+ 18F323932B8F525C00CABA2E /* AiTools.h */,
+ 18F323942B8F525C00CABA2E /* AiTools.m */,
+ 18F3238C2B8F4F7300CABA2E /* AiAudioManager.h */,
+ 18F3238D2B8F4F7300CABA2E /* AiAudioManager.m */,
+ 18F323822B8F330100CABA2E /* AiAuthManager.h */,
+ 18F323832B8F330100CABA2E /* AiAuthManager.m */,
+ 18F323A62B9095D300CABA2E /* AiAudioConverter.h */,
+ 18F323A72B9095D300CABA2E /* AiAudioConverter.m */,
+ 18F323C22B93352000CABA2E /* AiAudioDecoder.h */,
+ 18F323C32B93352000CABA2E /* AiAudioDecoder.m */,
);
- path = AiSdk;
+ path = AiMouseSdk;
sourceTree = "<group>";
};
18F323792B8F2EFB00CABA2E /* Products */ = {
18F3289C2B970B4000CABA2E /* ts.h in Headers */,
18F3281D2B970B3F00CABA2E /* timecode.h in Headers */,
18F328162B970B3F00CABA2E /* ffversion.h in Headers */,
- 18F323A82B9095D300CABA2E /* AiIotAudioConverter.h in Headers */,
+ 18F323A82B9095D300CABA2E /* AiAudioConverter.h in Headers */,
18F328272B970B3F00CABA2E /* hmac.h in Headers */,
18F328502B970B4000CABA2E /* swscale.h in Headers */,
18F328AE2B970B4000CABA2E /* idea.h in Headers */,
18F327FE2B970B3F00CABA2E /* blowfish.h in Headers */,
18F328032B970B3F00CABA2E /* stereo3d.h in Headers */,
18F328982B970B4000CABA2E /* ocsp.h in Headers */,
- 18F323C42B93352000CABA2E /* AiIotAudioDecoder.h in Headers */,
+ 18F323C42B93352000CABA2E /* AiAudioDecoder.h in Headers */,
18F3283F2B970B3F00CABA2E /* hdr_dynamic_metadata.h in Headers */,
18F328692B970B4000CABA2E /* dtls1.h in Headers */,
18F328012B970B3F00CABA2E /* version.h in Headers */,
18F3287A2B970B4000CABA2E /* dh.h in Headers */,
18F3284E2B970B3F00CABA2E /* avformat.h in Headers */,
18F328782B970B4000CABA2E /* bio.h in Headers */,
- 18F3238E2B8F4F7300CABA2E /* AiIotAudioManager.h in Headers */,
+ 18F3238E2B8F4F7300CABA2E /* AiAudioManager.h in Headers */,
18F3285F2B970B4000CABA2E /* dirac.h in Headers */,
18F328202B970B3F00CABA2E /* hwcontext_dxva2.h in Headers */,
18F328022B970B3F00CABA2E /* murmur3.h in Headers */,
18F327F62B970B3F00CABA2E /* buffersink.h in Headers */,
18F3280C2B970B3F00CABA2E /* avutil.h in Headers */,
18F328952B970B4000CABA2E /* rc4.h in Headers */,
+ 18AE9CE02B99C72000743515 /* AiMouse.h in Headers */,
18F328A32B970B4000CABA2E /* krb5_asn.h in Headers */,
18F328822B970B4000CABA2E /* safestack.h in Headers */,
18F328322B970B3F00CABA2E /* tea.h in Headers */,
18F328262B970B3F00CABA2E /* common.h in Headers */,
18F328552B970B4000CABA2E /* version.h in Headers */,
18F3288D2B970B4000CABA2E /* camellia.h in Headers */,
- 18BF1E8A2B8362D300B8D90F /* AiSdk.h in Headers */,
+ 18BF1E8A2B8362D300B8D90F /* AiMouseSdk.h in Headers */,
18F328372B970B3F00CABA2E /* encryption_info.h in Headers */,
18F328662B970B4000CABA2E /* pem.h in Headers */,
18F328482B970B3F00CABA2E /* intreadwrite.h in Headers */,
18F3285A2B970B4000CABA2E /* xvmc.h in Headers */,
18F3282B2B970B3F00CABA2E /* opt.h in Headers */,
18F3282C2B970B3F00CABA2E /* mastering_display_metadata.h in Headers */,
+ 18F328DE2B9950E000CABA2E /* AiFrameManager.h in Headers */,
18F3282F2B970B3F00CABA2E /* macros.h in Headers */,
18F328A82B970B4000CABA2E /* mdc2.h in Headers */,
18F328AB2B970B4000CABA2E /* asn1t.h in Headers */,
18F3280D2B970B3F00CABA2E /* xtea.h in Headers */,
18F3282D2B970B3F00CABA2E /* log.h in Headers */,
18F3280B2B970B3F00CABA2E /* lfg.h in Headers */,
- 18F323672B8F1C1900CABA2E /* AiIot.h in Headers */,
18F328AA2B970B4000CABA2E /* srtp.h in Headers */,
18F328AD2B970B4000CABA2E /* ebcdic.h in Headers */,
18F3282A2B970B3F00CABA2E /* random_seed.h in Headers */,
18F328532B970B4000CABA2E /* adts_parser.h in Headers */,
18F328522B970B4000CABA2E /* config.h in Headers */,
18F328172B970B3F00CABA2E /* audio_fifo.h in Headers */,
- 18F323842B8F330100CABA2E /* AiIotAuthManager.h in Headers */,
+ 18F323842B8F330100CABA2E /* AiAuthManager.h in Headers */,
18F3286D2B970B4000CABA2E /* cms.h in Headers */,
- 18F323952B8F525C00CABA2E /* AiIotTools.h in Headers */,
+ 18F323952B8F525C00CABA2E /* AiTools.h in Headers */,
18F3286B2B970B4000CABA2E /* bn.h in Headers */,
18F328992B970B4000CABA2E /* ec.h in Headers */,
18F328422B970B3F00CABA2E /* aes_ctr.h in Headers */,
productReference = 18BF1DE92B81AB8000B8D90F /* MouseSdkUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
- 18BF1E862B8362D300B8D90F /* AiSdk */ = {
+ 18BF1E862B8362D300B8D90F /* AiMouseSdk */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 18BF1E922B8362D300B8D90F /* Build configuration list for PBXNativeTarget "AiSdk" */;
+ buildConfigurationList = 18BF1E922B8362D300B8D90F /* Build configuration list for PBXNativeTarget "AiMouseSdk" */;
buildPhases = (
18BF1E822B8362D300B8D90F /* Headers */,
18BF1E832B8362D300B8D90F /* Sources */,
);
dependencies = (
);
- name = AiSdk;
+ name = AiMouseSdk;
productName = AiSdk;
- productReference = 18BF1E872B8362D300B8D90F /* AiSdk.framework */;
+ productReference = 18BF1E872B8362D300B8D90F /* AiMouseSdk.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
18BF1DC92B81AB7C00B8D90F /* MouseSdk */,
18BF1DDE2B81AB8000B8D90F /* MouseSdkTests */,
18BF1DE82B81AB8000B8D90F /* MouseSdkUITests */,
- 18BF1E862B8362D300B8D90F /* AiSdk */,
+ 18BF1E862B8362D300B8D90F /* AiMouseSdk */,
);
};
/* End PBXProject section */
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- 18F3238F2B8F4F7300CABA2E /* AiIotAudioManager.m in Sources */,
- 18F323C52B93352000CABA2E /* AiIotAudioDecoder.m in Sources */,
- 18F323A92B9095D300CABA2E /* AiIotAudioConverter.m in Sources */,
- 18F323682B8F1C1900CABA2E /* AiIot.m in Sources */,
- 18F323962B8F525C00CABA2E /* AiIotTools.m in Sources */,
- 18F323852B8F330100CABA2E /* AiIotAuthManager.m in Sources */,
+ 18F3238F2B8F4F7300CABA2E /* AiAudioManager.m in Sources */,
+ 18F323C52B93352000CABA2E /* AiAudioDecoder.m in Sources */,
+ 18F323A92B9095D300CABA2E /* AiAudioConverter.m in Sources */,
+ 18F328DF2B9950E000CABA2E /* AiFrameManager.m in Sources */,
+ 18F323962B8F525C00CABA2E /* AiTools.m in Sources */,
+ 18AE9CE12B99C72000743515 /* AiMouse.m in Sources */,
+ 18F323852B8F330100CABA2E /* AiAuthManager.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
};
18BF1E8C2B8362D300B8D90F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
- target = 18BF1E862B8362D300B8D90F /* AiSdk */;
+ target = 18BF1E862B8362D300B8D90F /* AiMouseSdk */;
targetProxy = 18BF1E8B2B8362D300B8D90F /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
GENERATE_INFOPLIST_FILE = YES;
- HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/AiSdk/ffmpeg/include";
+ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/AiMouseSdk/ffmpeg/include";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
);
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "$(PROJECT_DIR)/AiSdk/ffmpeg/lib",
+ "$(PROJECT_DIR)/AiMouseSdk/ffmpeg/lib",
);
MARKETING_VERSION = 1.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
- PRODUCT_BUNDLE_IDENTIFIER = zhihuishixun.AiSdk;
+ PRODUCT_BUNDLE_IDENTIFIER = zhihuishixun.AiMouse;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
GENERATE_INFOPLIST_FILE = YES;
- HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/AiSdk/ffmpeg/include";
+ HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/AiMouseSdk/ffmpeg/include";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
);
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "$(PROJECT_DIR)/AiSdk/ffmpeg/lib",
+ "$(PROJECT_DIR)/AiMouseSdk/ffmpeg/lib",
);
MARKETING_VERSION = 1.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
- PRODUCT_BUNDLE_IDENTIFIER = zhihuishixun.AiSdk;
+ PRODUCT_BUNDLE_IDENTIFIER = zhihuishixun.AiMouse;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 18BF1E922B8362D300B8D90F /* Build configuration list for PBXNativeTarget "AiSdk" */ = {
+ 18BF1E922B8362D300B8D90F /* Build configuration list for PBXNativeTarget "AiMouseSdk" */ = {
isa = XCConfigurationList;
buildConfigurations = (
18BF1E902B8362D300B8D90F /* Debug */,
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "18BF1E862B8362D300B8D90F"
- BuildableName = "AiSdk.framework"
- BlueprintName = "AiSdk"
+ BuildableName = "AiMouseSdk.framework"
+ BlueprintName = "AiMouseSdk"
ReferencedContainer = "container:MouseSdk.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "18BF1E862B8362D300B8D90F"
- BuildableName = "AiSdk.framework"
- BlueprintName = "AiSdk"
+ BuildableName = "AiMouseSdk.framework"
+ BlueprintName = "AiMouseSdk"
ReferencedContainer = "container:MouseSdk.xcodeproj">
</BuildableReference>
</MacroExpansion>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "1500"
+ version = "1.7">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "18BF1DC92B81AB7C00B8D90F"
+ BuildableName = "MouseSdk.app"
+ BlueprintName = "MouseSdk"
+ ReferencedContainer = "container:MouseSdk.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ shouldAutocreateTestPlan = "YES">
+ <Testables>
+ <TestableReference
+ skipped = "NO"
+ parallelizable = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "18BF1DDE2B81AB8000B8D90F"
+ BuildableName = "MouseSdkTests.xctest"
+ BlueprintName = "MouseSdkTests"
+ ReferencedContainer = "container:MouseSdk.xcodeproj">
+ </BuildableReference>
+ </TestableReference>
+ <TestableReference
+ skipped = "NO"
+ parallelizable = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "18BF1DE82B81AB8000B8D90F"
+ BuildableName = "MouseSdkUITests.xctest"
+ BlueprintName = "MouseSdkUITests"
+ ReferencedContainer = "container:MouseSdk.xcodeproj">
+ </BuildableReference>
+ </TestableReference>
+ </Testables>
+ </TestAction>
+ <LaunchAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ debugServiceExtension = "internal"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "18BF1DC92B81AB7C00B8D90F"
+ BuildableName = "MouseSdk.app"
+ BlueprintName = "MouseSdk"
+ ReferencedContainer = "container:MouseSdk.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </LaunchAction>
+ <ProfileAction
+ buildConfiguration = "Release"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "18BF1DC92B81AB7C00B8D90F"
+ BuildableName = "MouseSdk.app"
+ BlueprintName = "MouseSdk"
+ ReferencedContainer = "container:MouseSdk.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
+ <key>18BF1DC92B81AB7C00B8D90F</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>18BF1DDE2B81AB8000B8D90F</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>18BF1DE82B81AB8000B8D90F</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
<key>18BF1E862B8362D300B8D90F</key>
<dict>
<key>primary</key>
@interface BleManager : NSObject
@property (nonatomic,strong)void (^discoverDevice)(CBPeripheral *peripheral,NSDictionary *advertisementData) ;
-@property (nonatomic,strong)void (^didConnectDevice)(CBPeripheral *peripheral) ;
+@property (nonatomic,strong)void (^didConnectDevice)(CBPeripheral *peripheral);
+@property (nonatomic,strong)void (^authCallBack)(BOOL isSuccess);
+(id)shared;
#import "BleManager.h"
-#import <AiSdk/AiSdk.h>
+#import <AiMouseSdk/AiMouseSdk.h>
#import "Config.h"
-//#import "AliIotTools.h"
-#define kVoiceUUID @"0783B03E-8535-B5A0-7140-A304D2194CB8"
-//#define kUnUUID @"0783B03E-8535-B5A0-7140-A304D2495CB9"
+//鉴权特征
+#define kAiUUID @"0783B03E-8535-B5A0-7140-A304D2194CB8"
+//Ai特征
#define kAuthUUID @"0783B03E-8535-B5A0-7140-A304D2194CB7"
-@interface BleManager ()<CBCentralManagerDelegate,CBPeripheralDelegate,AiIotDelegate>
+@interface BleManager ()<CBCentralManagerDelegate,CBPeripheralDelegate,AiMouseDelegate>
@property (nonatomic,strong) NSMutableArray *scanArray;
@property(nonatomic, strong) CBCentralManager *centralManager;
@property(nonatomic, strong) CBPeripheral *connectPeripheral;
self = [super init];
if (self) {
self.centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
- [AiIot shared].delegate = self;
+ [AiMouse shared].delegate = self;
}
return self;
}
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
if ([characteristic.UUID.UUIDString isEqualToString:kAuthUUID] ||
- [characteristic.UUID.UUIDString isEqualToString:kVoiceUUID]
+ [characteristic.UUID.UUIDString isEqualToString:kAiUUID]
) {
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
NSData *data = characteristic.value;
- [self showLog:[NSString stringWithFormat:@"[receive] %@",[AiIotTools dataToHexString:data]]];
+// [self showLog:[NSString stringWithFormat:@"[receive] %@",data]];
+ [self showLog:[NSString stringWithFormat:@"[receive] %@",[AiTools dataToHexString:data]]];
if([characteristic.UUID.UUIDString isEqualToString:kAuthUUID]){
- [[AiIot shared] sendAuthToSdk:data];
+ [[AiMouse shared] sendAuthDataToSdk:data];
}
- else{
- [[AiIot shared] sendBuinessToSdk:data];
+ else if([characteristic.UUID.UUIDString isEqualToString:kAiUUID]){
+ [[AiMouse shared] sendAiDataToSdk:data];
}
}
-#pragma mark - AiIotDelegate
+#pragma mark - AiDelegate
/// 鉴权状态回调
/// - Parameter isSuccess:是否鉴权成功
--(void)aiIotSendAuthStatus:(BOOL)isSuccess{
+-(void)aiMouseAuthCallBack:(BOOL)isSuccess{
[self showLog:[NSString stringWithFormat:@"鉴权结果 = %@",@(isSuccess)]];
+ if(self.authCallBack){
+ self.authCallBack(isSuccess);
+ }
}
/// 鉴权数据回调,需要将此数据转发给蓝牙设备
/// - Parameter data: 数据
-- (void)aiIotSendAuthData:(NSData *)data{
- [self showLog:[NSString stringWithFormat:@"[send] %@",[AiIotTools dataToHexString:data]]];
+- (void)aiMouseSendAuthData:(NSData *)data{
+ [self showLog:[NSString stringWithFormat:@"[send] %@",[AiTools dataToHexString:data]]];
[self.connectPeripheral writeValue:data forCharacteristic:self.authCha type:CBCharacteristicWriteWithoutResponse];
}
/// 指令回调
/// - Parameter data: 数据
-- (void)aiIotSendCmd:(NSData *)data{
- NSString *str = [[AiIotTools dataToHexString:data] lowercaseString];
- NSString *cmd = [str substringWithRange:NSMakeRange(0, 12)];
- if([cmd hasPrefix:@"0a"] && [cmd hasSuffix:@"31"]){
- [self showLog:@"开始录音"];
+- (void)aiMouseSendCmdData:(NSData *)data{
+ NSString *cmd = [[AiTools dataToHexString:data] lowercaseString];
+ if([cmd hasSuffix:@"31"]){
+ [self showLog:@"录音键开始录音"];
+ self.recordData = [[NSMutableData alloc] init];
+ }
+ else if([cmd hasSuffix:@"32"]){
+ [self showLog:@"录音键结束录音"];
+ [self finishRecored:self.recordData];
+ }
+ if([cmd hasSuffix:@"25"]){
+ [self showLog:@"AI键开始录音"];
self.recordData = [[NSMutableData alloc] init];
}
- if( [cmd hasPrefix:@"0a"] && [cmd hasSuffix:@"32"]){
- [self showLog:@"结束录音"];
+ else if([cmd hasSuffix:@"26"]){
+ [self showLog:@"AI键结束录音"];
[self finishRecored:self.recordData];
}
-// else{
-// [self showLog:@"未实现指令"];
-// }
}
/// 录音回调
/// - Parameter data: pcm格式语音数据
-- (void)aiIotSendRecordData:(NSData *)data{
+- (void)aiMouseSendRecordData:(NSData *)data{
[self.recordData appendData:data];
}
}
- (void)startAuth{
- [[AiIot shared] startAuthentication];
+ [[AiMouse shared] startAuthentication];
}
#pragma mark - other
////
-//// AiIotPlayer.h
+//// AiPlayer.h
//// MouseSdk
////
//// Created by incar on 2024/2/28.
////
-//// AiIotPlayer.m
+//// AiPlayer.m
//// MouseSdk
////
//// Created by incar on 2024/2/28.
#import "ViewController.h"
#import "ScanVC.h"
-#import "AiIotTools.h"
+#import "AiTools.h"
#import "Ble/BleManager.h"
-
@interface ViewController ()
@end
// Do any additional setup after loading the view.
self.title = @"AI SDK";
{
- NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(100, self.view.bounds.size.height - 50, 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];
btn.state = 1;
[self.view addSubview:btn];
}
- {
- NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(100, self.view.bounds.size.height - 100, 100, 45)];
- btn.bordered = true;
- btn.title = @"initSDK";
- [btn setTarget:self];
- [btn setAction:@selector(initSDK)];
- btn.state = 1;
- [self.view addSubview:btn];
- }
{
NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(100, self.view.bounds.size.height - 150, 100, 45)];
btn.bordered = true;
- btn.title = @"fgs";
+ btn.title = @"鉴权";
[btn setTarget:self];
- [btn setAction:@selector(checkFGSStatus)];
- btn.state = 1;
- [self.view addSubview:btn];
- }
- {
- NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(100, self.view.bounds.size.height - 200, 100, 45)];
- btn.bordered = true;
- btn.title = @"lp";
- [btn setTarget:self];
- [btn setAction:@selector(connectLp)];
+ [btn setAction:@selector(checkAuth)];
btn.state = 1;
[self.view addSubview:btn];
}
- (void)setupBleManger{
BleManager *manager = [BleManager shared];
__weak typeof(BleManager) *weakManager = manager;
+ __weak typeof(self) ws = self;
manager.discoverDevice = ^(CBPeripheral *peripheral,NSDictionary *advertisementData){
if(peripheral.name.length == 0){
return;
};
manager.didConnectDevice = ^(CBPeripheral * _Nonnull peripheral) {
NSLog(@"连接成功");
-
};
-}
-- (void)initSDK{
-// NSData *data = [BleTools dataWithHexString:@"0000004f0000"];
-// [[BleManager shared] sendToBle:data];
-
+ manager.authCallBack = ^(BOOL isSuccess) {
+ [ws showAuthResult:isSuccess];
+ };
}
-- (void)checkFGSStatus{
+- (void)checkAuth{
[[BleManager shared] startAuth];
}
-- (void)connectLp{
-// [AliConnectMananger_C.shared startConnectLpStateWithResult:^(BOOL isSuccess, NSDictionary<NSString *,id> * dict) {
-// NSLog(@"lp成功 = %@,dict = %@",[NSNumber numberWithBool:isSuccess],[AliIotTools dictionaryToString:dict]);
-// }];
+- (void)showAuthResult:(BOOL)isSuccess{
+ dispatch_async(dispatch_get_main_queue(), ^{
+ NSAlert *alert = [NSAlert new];
+ [alert addButtonWithTitle:@"确定"];
+ [alert setMessageText:isSuccess?@"鉴权成功":@"鉴权失败"];
+ [alert setAlertStyle:NSAlertStyleInformational];
+ [alert beginSheetModalForWindow:[self.view window] completionHandler:^(NSModalResponse returnCode) {
+ }];
+ });
}
@end