188814C32C85C2BB009299A9 /* AESCBCHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 188814C02C85C2BA009299A9 /* AESCBCHelper.h */; };
188814C42C85C2BB009299A9 /* AESCBCHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 188814C12C85C2BA009299A9 /* AESCBCHelper.m */; };
188814C52C85C2BB009299A9 /* AESCBCHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 188814C12C85C2BA009299A9 /* AESCBCHelper.m */; };
+ 189365542CEB115200023B62 /* KeyboardHidManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 189365522CEB115200023B62 /* KeyboardHidManager.h */; };
+ 189365552CEB115200023B62 /* KeyboardHidManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 189365532CEB115200023B62 /* KeyboardHidManager.m */; };
+ 189365582CEB153000023B62 /* MSUtilis.h in Headers */ = {isa = PBXBuildFile; fileRef = 189365562CEB153000023B62 /* MSUtilis.h */; };
+ 189365592CEB153000023B62 /* MSUtilis.m in Sources */ = {isa = PBXBuildFile; fileRef = 189365572CEB153000023B62 /* MSUtilis.m */; };
+ 189960102CEAD7B50042505F /* KeyboardSdk.h in Headers */ = {isa = PBXBuildFile; fileRef = 1899600E2CEAD7B50042505F /* KeyboardSdk.h */; };
+ 189960112CEAD7B50042505F /* KeyboardSdk.m in Sources */ = {isa = PBXBuildFile; fileRef = 1899600F2CEAD7B50042505F /* KeyboardSdk.m */; };
18AD83252BFAE8B9009BDE3B /* AiDeviceInfoManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18AD83232BFAE8B9009BDE3B /* AiDeviceInfoManager.h */; };
18AD83262BFAE8B9009BDE3B /* AiDeviceInfoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AD83242BFAE8B9009BDE3B /* AiDeviceInfoManager.m */; };
18AD83292BFB22DE009BDE3B /* AiSender.h in Headers */ = {isa = PBXBuildFile; fileRef = 18AD83272BFB22DE009BDE3B /* AiSender.h */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
- 18068CFA2CDC8E2F006B6EF5 /* libAiMouseSdk copy.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libAiMouseSdk copy.a"; path = "/Users/apple/Desktop/code/MouseSdk-MacOS/MouseSdk/AiMouseSdk/build/Debug/libAiMouseSdk copy.a"; sourceTree = "<absolute>"; };
180E7AA62BD7BB12008558E8 /* libAiMouseManager.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAiMouseManager.a; sourceTree = BUILT_PRODUCTS_DIR; };
180E7AA92BD7BB12008558E8 /* AiMouseSdk.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiMouseSdk.h; sourceTree = "<group>"; };
180E7AAB2BD7BB12008558E8 /* AiMouseSdk.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiMouseSdk.m; sourceTree = "<group>"; };
188814BC2C85BB76009299A9 /* AiBkzhAuthManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiBkzhAuthManager.m; sourceTree = "<group>"; };
188814C02C85C2BA009299A9 /* AESCBCHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AESCBCHelper.h; sourceTree = "<group>"; };
188814C12C85C2BA009299A9 /* AESCBCHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AESCBCHelper.m; sourceTree = "<group>"; };
+ 189365512CEB0C3700023B62 /* libAiMouseSdk copy.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libAiMouseSdk copy.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 189365522CEB115200023B62 /* KeyboardHidManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KeyboardHidManager.h; sourceTree = "<group>"; };
+ 189365532CEB115200023B62 /* KeyboardHidManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KeyboardHidManager.m; sourceTree = "<group>"; };
+ 189365562CEB153000023B62 /* MSUtilis.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSUtilis.h; sourceTree = "<group>"; };
+ 189365572CEB153000023B62 /* MSUtilis.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSUtilis.m; sourceTree = "<group>"; };
+ 1899600E2CEAD7B50042505F /* KeyboardSdk.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KeyboardSdk.h; sourceTree = "<group>"; };
+ 1899600F2CEAD7B50042505F /* KeyboardSdk.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KeyboardSdk.m; sourceTree = "<group>"; };
18AD83232BFAE8B9009BDE3B /* AiDeviceInfoManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiDeviceInfoManager.h; sourceTree = "<group>"; };
18AD83242BFAE8B9009BDE3B /* AiDeviceInfoManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiDeviceInfoManager.m; sourceTree = "<group>"; };
18AD83272BFB22DE009BDE3B /* AiSender.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiSender.h; sourceTree = "<group>"; };
180E7A9D2BD7BB12008558E8 = {
isa = PBXGroup;
children = (
+ 1899600D2CEAD78B0042505F /* Keyboard */,
18D579FF2C91733E003D5714 /* NMouseSdk */,
18862A172C8064E300D3564D /* Manager */,
18EF7AE72C7603E800AC5223 /* TlwMouseSdk */,
180E7AA82BD7BB12008558E8 /* AiMouseSdk */,
180E7AA72BD7BB12008558E8 /* Products */,
180E7D092BD8FEB2008558E8 /* Frameworks */,
+ 189365512CEB0C3700023B62 /* libAiMouseSdk copy.a */,
);
sourceTree = "<group>";
};
18862A202C8064E300D3564D /* TimerManager.m */,
1888148C2C85766B009299A9 /* AiDeviceAuthManager.h */,
1888148D2C85766B009299A9 /* AiDeviceAuthManager.m */,
+ 189365562CEB153000023B62 /* MSUtilis.h */,
+ 189365572CEB153000023B62 /* MSUtilis.m */,
);
path = Manager;
sourceTree = "<group>";
};
+ 1899600D2CEAD78B0042505F /* Keyboard */ = {
+ isa = PBXGroup;
+ children = (
+ 1899600E2CEAD7B50042505F /* KeyboardSdk.h */,
+ 1899600F2CEAD7B50042505F /* KeyboardSdk.m */,
+ 189365522CEB115200023B62 /* KeyboardHidManager.h */,
+ 189365532CEB115200023B62 /* KeyboardHidManager.m */,
+ );
+ path = Keyboard;
+ sourceTree = "<group>";
+ };
18D579FF2C91733E003D5714 /* NMouseSdk */ = {
isa = PBXGroup;
children = (
180E7CE02BD8FC4E008558E8 /* version.h in Headers */,
180E7C972BD8FC4E008558E8 /* base64.h in Headers */,
180E7CC02BD8FC4E008558E8 /* mastering_display_metadata.h in Headers */,
+ 189960102CEAD7B50042505F /* KeyboardSdk.h in Headers */,
180E7CA02BD8FC4E008558E8 /* crc.h in Headers */,
180E7C8A2BD8FC4E008558E8 /* hwcontext_cuda.h in Headers */,
18D57A022C917385003D5714 /* NMouseSdk.h in Headers */,
180E7CB22BD8FC4E008558E8 /* tx.h in Headers */,
180E7C842BD8FC4E008558E8 /* version.h in Headers */,
180E7CEE2BD8FC4F008558E8 /* codec_desc.h in Headers */,
+ 189365582CEB153000023B62 /* MSUtilis.h in Headers */,
184A711F2BDD11C70025A332 /* AiTrippleModel.h in Headers */,
180E7CDC2BD8FC4E008558E8 /* mathematics.h in Headers */,
180E7CCD2BD8FC4E008558E8 /* imgutils.h in Headers */,
180E7C8E2BD8FC4E008558E8 /* fifo.h in Headers */,
180E7CC72BD8FC4E008558E8 /* cpu.h in Headers */,
180E7CF22BD8FC4F008558E8 /* d3d11va.h in Headers */,
+ 189365542CEB115200023B62 /* KeyboardHidManager.h in Headers */,
180E7CBC2BD8FC4E008558E8 /* eval.h in Headers */,
180E7CF72BD8FC4F008558E8 /* bsf.h in Headers */,
188814C22C85C2BB009299A9 /* AESCBCHelper.h in Headers */,
);
name = "AiMouseSdk copy";
productName = AiMouseSdk;
- productReference = 18068CFA2CDC8E2F006B6EF5 /* libAiMouseSdk copy.a */;
+ productReference = 189365512CEB0C3700023B62 /* libAiMouseSdk copy.a */;
productType = "com.apple.product-type.library.static";
};
/* End PBXNativeTarget section */
buildActionMask = 2147483647;
files = (
18FCA3982C7F2AD100C44A37 /* AiMouseAuth.m in Sources */,
+ 189365552CEB115200023B62 /* KeyboardHidManager.m in Sources */,
18862A2A2C8064E300D3564D /* TimerManager.m in Sources */,
18862A232C8064E300D3564D /* HidManager.m in Sources */,
180E7BE52BD7BD84008558E8 /* AiMouseTools2.m in Sources */,
184A710C2BDA4C050025A332 /* AFNetworkReachabilityManager.m in Sources */,
180E7BE42BD7BD84008558E8 /* AiRecordManager.m in Sources */,
18EF7B042C7603E800AC5223 /* TlwAudioManager.m in Sources */,
+ 189960112CEAD7B50042505F /* KeyboardSdk.m in Sources */,
180E7BE72BD7BD84008558E8 /* AiAudioManager.m in Sources */,
18EF7AFB2C7603E800AC5223 /* TlwTools.m in Sources */,
18EF7AFA2C7603E800AC5223 /* TlwMouseSdk.m in Sources */,
184A710D2BDA4C050025A332 /* AFSecurityPolicy.m in Sources */,
18862A272C8064E300D3564D /* DeviceManger.m in Sources */,
180E7B552BD7BD83008558E8 /* AiAudioDecoder.m in Sources */,
+ 189365592CEB153000023B62 /* MSUtilis.m in Sources */,
18AD83262BFAE8B9009BDE3B /* AiDeviceInfoManager.m in Sources */,
18EF7B012C7603E800AC5223 /* adpcm.c in Sources */,
184A71092BDA4C050025A332 /* AFURLSessionManager.m in Sources */,
--- /dev/null
+//
+// KeyboardHidManager.h
+// AiMouseManager
+//
+// Created by incar on 2024/11/18.
+//
+
+#import <Foundation/Foundation.h>
+#import "DeviceManger.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KeyboardHidManager : NSObject
+@property (nonatomic, copy)void (^connectStateCallBack)(BOOL connected);/// 设备连接状态回调
+@property (nonatomic, copy)void (^receiveInfoDataCallBack)(NSData *data);/// 设备信息数据回调
+@property (nonatomic, copy)void (^logCallBack)(NSString *log);//输出日志
+
+@property (nonatomic, assign)AiMouseProductType productType;//
+
++(KeyboardHidManager *)shared;
+
+- (void)open;
+
+//- (void)close;
+
+//写入数据
+-(void)writeToDevice:(NSData *)data;
+@end
+
+NS_ASSUME_NONNULL_END
+
--- /dev/null
+//
+// KeyboardHidManager.m
+// AiMouseManager
+//
+// Created by incar on 2024/11/18.
+//
+
+#import "KeyboardHidManager.h"
+
+#include <IOKit/hid/IOHIDLib.h>
+#include <IOKit/hid/IOHIDKeys.h>
+#import <Security/Security.h>
+#import <Carbon/Carbon.h>
+#import <Cocoa/Cocoa.h>
+#import "AiDeviceAuthManager.h"
+
+@interface KeyboardHidManager ()
+@property(nonatomic, assign) IOHIDManagerRef hidManager;///hid管理
+@property(nonatomic, assign) IOHIDDeviceRef deviceInfoCha;//设备信息通道
+@end
+
+@implementation KeyboardHidManager
++(KeyboardHidManager *)shared{
+ static KeyboardHidManager *manager = nil;
+ static dispatch_once_t oncePredicate;
+ dispatch_once(&oncePredicate, ^{
+ manager = [[KeyboardHidManager alloc]init];
+ });
+ return manager;
+}
+
+- (instancetype)init{
+ self = [super init];
+ if (self) {
+
+ }
+ return self;
+}
+
+#pragma mark - Hid CallBack
+/// 匹配到设备回调
+static void hidAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) {
+ if ([DeviceManger shared].isConneted) {
+// [[KeyboardHidManager shared] showLog:(@"当前处于连接状态,对监听到有USB 插入 的事件不做处理")];
+ return;
+ }
+// 1ea7 0064
+ uint32_t pid = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDProductIDKey));
+ uint32_t vid = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDVendorIDKey));
+ uint32_t PrimaryUsagePage = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDPrimaryUsagePageKey));
+ uint32_t PrimaryUsage = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDPrimaryUsageKey));
+// [[KeyboardHidManager shared] showLog:([NSString stringWithFormat:@"keyboard 发现设备%@,pid = %d,vid = %d ,page = %d, usage = %d",inIOHIDDeviceRef,pid,vid,PrimaryUsagePage,PrimaryUsage])];
+
+
+ if((vid == 0x248a && pid == 0x6092)){
+ [[KeyboardHidManager shared] showLog:([NSString stringWithFormat:@"发现键盘%@,pid = %d,vid = %d ,page = %d, usage = %d",inIOHIDDeviceRef,pid,vid,PrimaryUsagePage,PrimaryUsage])];
+ [KeyboardHidManager shared].productType = AiMouseProductType_n;
+ [KeyboardHidManager shared].deviceInfoCha = inIOHIDDeviceRef;
+ //注册消息回调
+ unsigned char InputBuffer[64];
+ IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), &hidReceiveData, NULL);
+
+ IOReturn result = IOHIDDeviceOpen([KeyboardHidManager shared].deviceInfoCha, kIOHIDOptionsTypeNone);
+ if (result != kIOReturnSuccess) {
+ [[KeyboardHidManager shared] showLog:[NSString stringWithFormat:@"打开设备失败! %d",result]];
+ [[AiDeviceAuthManager shared] showHidAlert];
+ return;
+ }else{
+ [[KeyboardHidManager shared] showLog:@"打开设备成功!"];
+ [KeyboardHidManager shared].connectStateCallBack(true) ;
+ }
+ }
+
+}
+
+/// 设备移除回调
+static void hidDisAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) {
+ [[KeyboardHidManager shared] showLog:[NSString stringWithFormat:@"拔出设备 %@ ",inIOHIDDeviceRef]];
+
+ if([KeyboardHidManager shared].deviceInfoCha){
+ [KeyboardHidManager shared].deviceInfoCha = nil;
+ [KeyboardHidManager shared].hidManager = nil;
+ [KeyboardHidManager shared].connectStateCallBack(false) ;
+ }
+}
+
+
+static void hidReceiveData(void* context, IOReturn result, void* sender, IOHIDReportType type, uint32_t reportID, uint8_t *report,CFIndex reportLength){
+ NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
+ [[KeyboardHidManager shared] showLog:[NSString stringWithFormat:@"receive = %@",data]];
+ if([KeyboardHidManager shared].productType == AiMouseProductType_n){
+ uint32_t primaryUsagePage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsagePageKey));
+ uint32_t primaryUsage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsageKey));
+ NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
+ [KeyboardHidManager shared].receiveInfoDataCallBack(data);
+ }
+
+}
+
+#pragma mark - public
+- (void)open{
+ [self close];
+ //初始化
+ self.deviceInfoCha = nil;
+ self.hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
+ IOHIDManagerScheduleWithRunLoop(self.hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
+ IOReturn ret = IOHIDManagerOpen(self.hidManager, 0L);
+ if (ret != kIOReturnSuccess) {
+ [self showLog:(@"打开hid失败!")];
+ }else{
+ [self showLog:(@"打开hid成功!")];
+ }
+ //设置匹配设备
+ // ////供应商id
+ // const long vendorID = 0x6675;
+ // //产品id
+ // const long productID = 0x8601;
+ // //供应商id
+ // const long vendorID = 0x10D6;
+ // //产品id
+ // const long productID = 0xB008;
+ NSMutableDictionary* dict= [NSMutableDictionary dictionary];
+ // [dict setValue:[NSNumber numberWithLong:productID] forKey:[NSString stringWithCString:kIOHIDProductIDKey encoding:NSUTF8StringEncoding]];
+ // [dict setValue:[NSNumber numberWithLong:vendorID] forKey:[NSString stringWithCString:kIOHIDVendorIDKey encoding:NSUTF8StringEncoding]];
+ IOHIDManagerSetDeviceMatching(self.hidManager, (__bridge CFMutableDictionaryRef)dict);
+ //设置匹配到设备回调
+ IOHIDManagerRegisterDeviceMatchingCallback(self.hidManager, &hidAppearDevice, NULL);
+ //设置移除设备回调
+ IOHIDManagerRegisterDeviceRemovalCallback(self.hidManager, &hidDisAppearDevice, NULL);
+}
+
+- (void)close{
+ if (self.hidManager == nil) {
+ return;
+ }
+ [self showLog:@"关闭hid"];
+
+ IOReturn ret = IOHIDManagerClose(self.hidManager, 0);
+ self.hidManager = nil;
+
+ if (ret != kIOReturnSuccess) {
+ [self showLog:(@"关闭hid失败!")];
+ }else{
+ [self showLog:(@"关闭hid成功!")];
+ self.deviceInfoCha = nil;
+ self.hidManager = nil;
+ }
+}
+/// 发送数据给设备
+-(void)writeToDevice:(NSData *)data{
+ if(self.deviceInfoCha == nil){
+ [self showLog:@"sendData: 请先连上设备"];
+ return;
+ }
+
+ [self showLog:[NSString stringWithFormat:@"向usb设备发送数据 %@",data]];
+ IOReturn ret = IOHIDDeviceSetReport(self.deviceInfoCha, kIOHIDReportTypeOutput, 0, data.bytes, data.length);
+ if (ret != kIOReturnSuccess) {
+ [self showLog:[NSString stringWithFormat:@"发送失败! code = %d",ret]];
+ }else{
+// [self showLog:@"发送成功!"];
+ }
+}
+
+
+- (void)showLog:(NSString *)log{
+ NSString *text = [NSString stringWithFormat:@"[KeyboardHidManager] %@",log];
+ if(self.logCallBack) self.logCallBack(text);
+}
+
+/// 实际到数据长度
+static inline int get_data_len(uint8_t *buf, u_long len) {
+ if (len <= 0 ) return 0;
+ int url_len = 0;
+ while (buf[url_len] != 0x00) url_len++;
+ return url_len;
+}
+
+- (NSString *)dataToHexString:(NSData *)data {
+ NSUInteger length = data.length;
+ NSMutableString *result = [NSMutableString stringWithCapacity:length * 2];
+ const unsigned char *byte = data.bytes;
+ for (int i = 0; i < length; i++, byte++) {
+ [result appendFormat:@"%02X", *byte];
+ }
+ return result;
+}
+
+
+/// 获取对应属性值
+static uint32_t IOHIDDevGetUInt32Property(IOHIDDeviceRef inIOHIDDeviceRef, CFStringRef inKey) {
+ uint32_t outValue = 0;
+ if (inIOHIDDeviceRef != NULL) {
+ CFTypeRef tCFTypeRef = IOHIDDeviceGetProperty(inIOHIDDeviceRef, inKey);
+ if (tCFTypeRef != NULL && (CFNumberGetTypeID() == CFGetTypeID(tCFTypeRef)) ) {
+ Boolean result = CFNumberGetValue((CFNumberRef) tCFTypeRef, kCFNumberSInt32Type, &outValue);
+ if (!result) {
+ [[KeyboardHidManager shared] showLog:[NSString stringWithFormat:@"(HidManager)IOHIDDevGetUInt32Property:get %@ failed.", inKey]];
+ }
+ }
+ }
+ return outValue;
+}
+@end
--- /dev/null
+//
+// KeyboardSdk.h
+// AiMouseManager
+//
+// Created by incar on 2024/11/18.
+//
+
+
+#import <Foundation/Foundation.h>
+#import "AiMouseSdk.h"
+@interface KeyboardInfo : NSObject
+@property (nonatomic, assign) int DPI;/// DPI值 数值1 ~ 4 (分别对应1200,1600,2400,4800)
+@property (nonatomic, assign) int version;///软件版本
+@property (nonatomic, assign) int batteryState;/// 电池状态
+@property (nonatomic, assign) int batteryValue;/// 电池百分百电量,0-100
+@end
+
+
+@protocol KeyboardSdkDelegate <NSObject>
+
+/// 设备连接状态
+/// - Parameter connected: 是否连接
+- (void)keyboardConnectStateDidChange:(BOOL)connected;
+
+
+/// 设备信息数据回调,需要将此数据通过设备信息特征转发给蓝牙设备
+/// - Parameter data: 数据
+- (void)keyboardSendDeviceInfoData:(NSData *)data;
+
+/// 鼠标按键指令回调
+//0x81: 截屏 (fn + a)
+//0x82: AI问答 (fn + s)
+//0x83: AI写作 (fn + d)
+//0x84: AI PPT (fn + f)
+//0x85: 智能阅读 (fn + g)
+//0x86: 长文写作 (fn +h)
+//0x87: 文稿校对 (fn + j)
+//0x88: AI绘画 (fn + k)
+//0x89: AI 翻译 (fn + l)
+//0x8a: 模版下载 (fn + ;)
+//0x8b: 思维导图 (fn + ‘)
+//0x8c: 工作总结 (fn + n)
+//0x8d: 日报/周报 (fn + m)
+//0x8e: AI 教案 (fn + ,)
+//0x8f: AI 律师 (fn + .)
+//0x90: AI 电商 (fn + /)
+//0x91: AI上网 (fn + PgUp)
+//0x92: AI办公 (fn + PgDn)
+- (void)keyboardSendCmdData:(NSData *)data;
+
+/// 输出sdk日志
+/// - Parameter log: 日志
+- (void)keyboardAddLog:(NSString *)log;
+
+@end
+
+
+@interface KeyboardSdk : NSObject
+@property (nonatomic, weak) id<KeyboardSdkDelegate> delegate;/// 代理
+@property (nonatomic, readonly) AiMouseConnectType connectType;//连接类型
+@property (nonatomic, readonly) BOOL connected;//是否已连接
+
+/// 切换连接类型
+/// - Parameter type: 连接类型
+- (void)switchConnect:(AiMouseConnectType)type isConnected:(BOOL)isConneted;
+
+/// 断开连接
+- (void)didDisconnect;
+
+/// 传输设备信息数据给sdk
+/// - Parameter data:设备信息特征传过来的数据
+- (void)sendDeviceDataToSdk:(NSData *)data;
+
+/// 获取设备信息
+/// - Parameter completation: 如果获取成功,则deviceInfo有值,否则为nil
+- (void)getDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))finished;
+@end
--- /dev/null
+//
+// KeyboardSdk.m
+// AiMouseManager
+//
+// Created by incar on 2024/11/18.
+//
+
+#import "KeyboardSdk.h"
+#import "TlwTools.h"
+#import "TlwMouseSdk.h"
+@interface KeyboardSdk()
+
+@property (nonatomic,strong)void (^getDeviceInfoCallBack)(AiMouseDeviceInfo *deviceInfo,NSError *error);
+
+@property (nonatomic,strong)void (^getUsbSateCallBack)(int bind,NSError *error);
+@property (nonatomic,strong)void (^getKeyboardStateCallBack)(NSString *version,uint8_t battery,NSError *error);
+@property (nonatomic,strong)void (^getInfoCallBack)(TlwSnInfo *info,NSError *error);
+
+@property (nonatomic,assign)NSInteger dongleTimes;
+@property (nonatomic,strong)AiMouseDeviceInfo *deviceInfo;
+@end
+
+@implementation KeyboardSdk
+/// 切换连接类型
+/// - Parameter type: 连接类型
+- (void)switchConnect:(AiMouseConnectType)type isConnected:(BOOL)isConneted{
+ if(isConneted ){
+ _connected = true;
+ _connectType = type;
+ [self showLog:type == AiMouseConnectType_bluetooth?@"sdk切换到蓝牙模式":@"sdk切换到usb模式"];
+
+ if (type == AiMouseConnectType_hid ) {
+ [self getDeviceInfo:^(AiMouseDeviceInfo *deviceInfo, NSError *error) {
+
+ }];
+// [self sendCmd:0x0D];
+ [self startCheckConnectState];
+ }
+ else{
+ [self TlwConnectManager:nil connectStateDidChange:true];
+ }
+ }
+ else{
+ if (self.connected) {
+ _connected = false;
+ [self TlwConnectManager:nil connectStateDidChange:false];
+ }
+ }
+}
+
+- (void)didDisconnect{
+ _connected = false;
+}
+
+
+- (void)sendDeviceDataToSdk:(NSData *)data{
+ NSString *text = [TlwTools dataToHexString:data];
+ [self showLog:[NSString stringWithFormat:@"[receive][usb][info] %@",text]];
+
+ if (data.length < 6) {
+ return;
+ }
+ uint8_t cmd;
+ [data getBytes:&cmd range:NSMakeRange(5, 1)];
+
+ if (cmd == 0x22) {
+ //序列号回复
+ data = [data subdataWithRange:NSMakeRange(7, data.length - 8)];
+ NSString *code = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 2)] encoding:NSUTF8StringEncoding];
+ NSString *brand = [self getBrand:[data subdataWithRange:NSMakeRange(2, 6)]];
+ NSString *batch = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(8, 2)] encoding:NSUTF8StringEncoding];
+ NSString *mac = [[TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(10, 6)]] lowercaseString];
+
+ NSString *fullBrand = [self getFullBrand:[data subdataWithRange:NSMakeRange(2, 6)]];
+ NSString *sn = [NSString stringWithFormat:@"%@%@%@%@",code,fullBrand,batch,mac] ;
+ TlwSnInfo *info = [[TlwSnInfo alloc] init];
+ info.code = code;
+ info.brand = brand;
+ info.batch = batch;
+ info.mac = mac;
+ info.sn = sn;
+ [self showLog:info.description];
+ if(self.getInfoCallBack)self.getInfoCallBack(info, nil);
+ }
+ else if (cmd == 0x9c) {
+ //键盘状态查询
+ data = [data subdataWithRange:NSMakeRange(7, data.length - 8)];
+ NSString *version = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 2)] encoding:NSUTF8StringEncoding];
+ uint8_t batteryState;// 0. 未充电 , 1 充电
+ [[data subdataWithRange:NSMakeRange(4, 1)] getBytes:&batteryState length:1];
+ uint8_t battery;
+ [[data subdataWithRange:NSMakeRange(5, 1)] getBytes:&battery length:1];
+
+ NSString *log = [NSString stringWithFormat:@"version = %@,batteryState = %d,battery = %d",version,batteryState,battery];
+ [self showLog:log];
+
+ if(self.getKeyboardStateCallBack)self.getKeyboardStateCallBack(version,battery, nil);
+ }
+ else if(cmd == 0x9d){
+ //接收器状态查询
+ data = [data subdataWithRange:NSMakeRange(7, data.length - 8)];
+ NSString *version = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 2)] encoding:NSUTF8StringEncoding];
+ uint8_t bind;
+ [[data subdataWithRange:NSMakeRange(2, 1)] getBytes:&bind length:1];
+ NSString *log = [NSString stringWithFormat:@"version = %@,bind = %d",version,bind];
+ [self showLog:log];
+ if(self.getUsbSateCallBack)self.getUsbSateCallBack(bind, nil);
+ }
+ else if(cmd == 0x9f){
+ //接收器状态查询
+ data = [data subdataWithRange:NSMakeRange(7, 1)];
+ uint8_t type;
+ [[data subdataWithRange:NSMakeRange(0, 1)] getBytes:&type length:1];
+ NSString *log = [NSString stringWithFormat:@"type = %d",type];
+ [self showLog:log];
+ if([self.delegate respondsToSelector:@selector(keyboardSendCmdData:)])[self.delegate keyboardSendCmdData:data];
+ }
+}
+- (void)getDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))finished{
+ [NSObject cancelPreviousPerformRequestsWithTarget:self];
+ self.getDeviceInfoCallBack = finished;
+
+ self.deviceInfo = [[AiMouseDeviceInfo alloc] init];
+ self.deviceInfo.battery_power = @"0";
+ self.deviceInfo.CPI = @"1200";
+ self.deviceInfo.CPI_list = @"1200,1600,2400,4800";
+ self.deviceInfo.version = @"1";
+ self.deviceInfo.sn = @"";
+ self.deviceInfo.mac = @"";
+
+ __weak typeof(self) ws = self;
+ [ws getSn:^(TlwSnInfo *info, NSError *error) {
+ if (info) {
+ ws.deviceInfo.brand = info.brand;
+ ws.deviceInfo.sn = info.sn;
+ ws.deviceInfo.mac = info.mac;
+ [ws showLog:info.description];
+
+ [ws getKeyboardState:^(NSString *version, uint8_t battery, NSError *error) {
+ if(error == nil){
+ ws.deviceInfo.version = version;
+ ws.deviceInfo.battery_power = [NSString stringWithFormat:@"%d",battery];
+ ws.getDeviceInfoCallBack(ws.deviceInfo, nil);
+ }
+ else{
+ ws.getDeviceInfoCallBack(nil, error);
+ }
+ }];
+ }
+ else{
+ ws.getDeviceInfoCallBack(nil, error);
+ }
+ }];
+}
+
+//键盘状态查询
+- (void)getKeyboardState:(void (^)(NSString *version,uint8_t battery,NSError *error))finished{
+ self.getKeyboardStateCallBack = finished;
+ [self sendCmd:0x0c];
+}
+
+//usb接收器状态查询
+- (void)getUsbReceiverState:(void (^)(int bind,NSError *error))finished{
+ self.getUsbSateCallBack = finished;
+ [self sendCmd:0x0D];
+}
+
+//读取键盘序列号
+- (void)getSn:(void (^)(TlwSnInfo *info,NSError *error))finished{
+ self.getInfoCallBack = finished;
+ [self getUsbReceiverState:^(int bind, NSError *error) {
+ if (bind == 1) {
+ [self sendCmd:0x12];
+ }
+ }];
+
+}
+#pragma mark - check connect
+- (void)startCheckConnectState{
+ self.dongleTimes = 0;
+ [self checkAction];
+}
+- (void)checkAction{
+ if (self.deviceInfo.sn && self.deviceInfo.sn.length > 0) {
+ [self TlwConnectManager:nil connectStateDidChange:true];
+ return;
+ }
+ self.dongleTimes++;
+ if (self.dongleTimes > 3) {
+ [self TlwConnectManager:nil connectStateDidChange:false];
+ return;
+ }
+ [self performSelector:@selector(checkAction) withObject:nil afterDelay:1];
+}
+
+#pragma mark - other
+-(void)TlwConnectManager:(NSString *)manager connectStateDidChange:(BOOL)connected{
+ _connected = connected;
+ if([self.delegate respondsToSelector:@selector(keyboardConnectStateDidChange:)]) [self.delegate keyboardConnectStateDidChange:connected];
+}
+- (void)showLog:(NSString *)log{
+ if (self.delegate && [self.delegate respondsToSelector:@selector(keyboardAddLog:)]) {
+ [self.delegate keyboardAddLog:[NSString stringWithFormat:@"[keyboard]%@",log]];
+ }
+}
+
+- (void)sendCmd:(uint8_t)cmd{
+ uint8_t reportId = 0x04;//开头
+ uint8_t head0 = 0xff;//头分区
+ uint8_t head1 = 0xf1;//头分区
+ uint8_t head2 = 0xfe;//头信息
+ uint8_t type = 0x00;//0x00 app发往键盘,0xc0键盘回复
+// uint8_t cmd = 0x00;//类型
+ uint8_t len = 0x00;//数据负载长度
+// uint8_t data =
+ uint8_t tail = 0xef;
+
+ NSMutableData *mData = NSMutableData.data;
+ [mData appendBytes:&reportId length:1];
+ [mData appendBytes:&head0 length:1];
+ [mData appendBytes:&head1 length:1];
+ [mData appendBytes:&head2 length:1];
+ [mData appendBytes:&type length:1];
+ [mData appendBytes:&cmd length:1];
+ [mData appendBytes:&len length:1];
+ [mData appendBytes:&tail length:1];
+
+ if (mData.length < 64) {
+ NSInteger len = 64 - mData.length;
+ for (NSInteger i = 0; i < len; i++) {
+ uint8_t d = 0x00;
+ [mData appendBytes:&d length:1];
+ }
+ }
+
+
+ [self showLog:[NSString stringWithFormat:@"[send][info] %@",[TlwTools dataToHexString:mData]]];
+ [self.delegate keyboardSendDeviceInfoData:mData];
+}
+
+- (NSString *)getBrand:(NSData *)data{
+ NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ for (NSInteger i = 0; i < text.length;i++) {
+ if ([[text substringWithRange:NSMakeRange(i, 1)] isEqual:@"\0"]) {
+ return [text substringWithRange:NSMakeRange(0, i)];
+ }
+ }
+ return text;
+}
+- (NSString *)getFullBrand:(NSData *)data{
+ NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ NSString *replacedString = [text stringByReplacingOccurrencesOfString:@"\0" withString:@"0"];
+ return replacedString;
+}
+@end
+
AiMouseProductType_frk = 1,///富瑞坤
AiMouseProductType_tlw = 2,///泰凌微
AiMouseProductType_n = 3,///一键上网
+ AiMouseProductType_keyboard = 4,///键盘
};
NS_ASSUME_NONNULL_BEGIN
#import "NMouseSdk.h"
#import "TimerManager.h"
#import "AiMouseConfig.h"
+#import "KeyboardHidManager.h"
+#import "KeyboardSdk.h"
-@interface DeviceManger()<TlwMouseDelegate,AiMouseDelegate,NMouseSdkDelegate>
+@interface DeviceManger()<TlwMouseDelegate,AiMouseDelegate,NMouseSdkDelegate,KeyboardSdkDelegate>
@property (nonatomic,strong) NSMutableData *recordData;//录音的数据
@property (nonatomic,strong) BleManager *ble;
@property (nonatomic,strong) TlwMouse *tlwSdk;
@property (nonatomic,strong) AiMouse *frkSdk;
@property (nonatomic,strong) NMouseSdk *nSdk;
+@property (nonatomic,strong) KeyboardSdk *kbSdk;
@property (nonatomic,assign) AiMouseProductType productType;
//connectType 返回为0代表蓝牙,为1代表usb
- (instancetype)init{
self = [super init];
if (self) {
- NSString *version = @"MouseSdk_v2024110802";
+ NSString *version = @"MouseSdk_v2024111901";
NSLog(@"[AiMouseSdk] %@",version);
- [self showLog:version];
+ [self showLog:version];;
[self setupSDK];
[self setupBle];
[self setupHid];
[self setupTimer];
+// [self setupKeyboard];
}
return self;
}
#pragma mark ------ 设备初始化
- (void)setupSDK{
+ self.kbSdk = [[KeyboardSdk alloc] init];
+ [self.kbSdk setDelegate:self];
+
self.nSdk = [[NMouseSdk alloc] init];
[self.nSdk setDelegate:self];
[self.frkSdk setLogLevel:AiMouseLogLevel_none];
}
-
+- (void)setupKeyboard{
+ [KeyboardHidManager shared].receiveInfoDataCallBack = ^(NSData * _Nonnull data) {
+
+ };
+ [KeyboardHidManager shared].connectStateCallBack = ^(BOOL connected) {
+ [self.kbSdk switchConnect:AiMouseConnectType_hid isConnected:true];
+ };
+ [KeyboardHidManager shared].logCallBack = ^(NSString * _Nonnull log) {
+ [self showLog:log];
+ };
+ [[KeyboardHidManager shared] open];
+}
- (void)setupTimer{
[TimerManager shared].timerCallBack = ^{
// [self showLog:@"timer action。。。"];
- if(self.nSdk.connected || self.tlwSdk.connected || self.frkSdk.connected){
+ if(self.kbSdk.connected || self.nSdk.connected || self.tlwSdk.connected || self.frkSdk.connected){
// [self.hid close];
}
else{
}
};
}
+
+
- (void)setupHid{
+
self.hid = [HidManager shared];
__weak typeof(self) ws = self;
else if (ws.hid.productType == AiMouseProductType_tlw) {
[ws.tlwSdk switchConnect:AiMouseConnectType_hid isConnected:true];
}
- else{
+ else if (ws.hid.productType == AiMouseProductType_frk){
[ws.frkSdk switchConnect:AiMouseConnectType_hid isConnected:true];
}
+ else if (ws.hid.productType == AiMouseProductType_keyboard){
+ [ws.kbSdk switchConnect:AiMouseConnectType_hid isConnected:true];
+ }
}
else{
if (ws.hid.productType == AiMouseProductType_n) {
[ws.tlwSdk switchConnect:AiMouseConnectType_hid isConnected:false];
[ws.tlwSdk didDisconnect];
}
- else{
+ else if (ws.hid.productType == AiMouseProductType_frk) {
[ws.frkSdk switchConnect:AiMouseConnectType_hid isConnected:false];
[ws.frkSdk didDisconnect];
}
+ else if (ws.hid.productType == AiMouseProductType_keyboard) {
+ [ws.kbSdk switchConnect:AiMouseConnectType_hid isConnected:false];
+ [ws.kbSdk didDisconnect];
+ }
}
};
self.hid.receiveInfoDataCallBack = ^(NSData *data) {
else if (ws.productType == AiMouseProductType_tlw) {
[ws.tlwSdk sendDeviceDataToSdk:data];
}
- else{
+ else if (ws.hid.productType == AiMouseProductType_frk){
[ws.frkSdk sendDeviceDataToSdk:data];
}
+ else if (ws.hid.productType == AiMouseProductType_keyboard) {
+ [ws.kbSdk sendDeviceDataToSdk:data];
+ }
};
self.hid.logCallBack = ^(NSString * _Nonnull log) {
[ws showLog:log];
}
}
else{
- if (ws.ble.productType == AiMouseProductType_n) {
+ if (ws.ble.productType == AiMouseProductType_keyboard) {
+ [ws.kbSdk switchConnect:AiMouseConnectType_bluetooth isConnected:false];
+ }
+ else if (ws.ble.productType == AiMouseProductType_n) {
[ws.nSdk switchConnect:AiMouseConnectType_bluetooth isConnected:false];
}
else if (ws.ble.productType == AiMouseProductType_tlw) {
}
};
self.ble.receiveInfoDataCallBack = ^(NSData *data) {
- if (ws.productType == AiMouseProductType_n) {
+ if (ws.productType == AiMouseProductType_keyboard) {
+ [ws.kbSdk sendDeviceDataToSdk:data];
+ }
+ else if (ws.productType == AiMouseProductType_n) {
[ws.nSdk sendDeviceDataToSdk:data];
}
else if (ws.productType == AiMouseProductType_tlw) {
#pragma mark ------ 设备相关接口
-(BOOL)isConneted{
+ if (self.kbSdk != nil && self.kbSdk.connected) {
+ return true;
+ }
if (self.nSdk != nil && self.nSdk.connected) {
return true;
}
return false;
}
- (NSString *)getCurrentConnectType {
+ if (self.productType == AiMouseProductType_keyboard) {
+ if (self.kbSdk.connectType == AiMouseConnectType_bluetooth) {
+ return @"0";
+ }
+ else {
+ return @"1";
+ }
+ }
if (self.productType == AiMouseProductType_n) {
if (self.nSdk.connectType == AiMouseConnectType_bluetooth) {
return @"0";
}
}
-(AiMouseConnectType)connectType{
- if (self.productType == AiMouseProductType_n) {
+ if (self.productType == AiMouseProductType_keyboard) {
+ return self.kbSdk.connectType;
+ }
+ else if (self.productType == AiMouseProductType_n) {
return self.nSdk.connectType;
}
else if (self.productType == AiMouseProductType_tlw) {
return self.tlwSdk.connectType;
}
- else{
+ else {
return self.frkSdk.connectType;
}
+
}
- (void)begainMonitorAiMouseConnectStateDidChange:(NSString *)mouseName callBack:(void(^)(int connectType, BOOL connected))callBack{
}
///获取设备信息
- (void)getDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))finished{
- if(self.productType == AiMouseProductType_n){
+ if(self.productType == AiMouseProductType_keyboard){
+ [self.kbSdk getDeviceInfo:finished];
+ }
+ else if(self.productType == AiMouseProductType_n){
[self.nSdk getDeviceInfo:finished];
}else if (self.productType == AiMouseProductType_tlw) {
[self.tlwSdk getFullDeviceInfo:finished];
/// 获取信号强度
- (void)getRSSI:(void (^)(NSString *value,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// 设置CPI
- (void)setCPI:(NSInteger)value completation:(void (^)(BOOL isSuccess,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// - value: 品牌名称
/// - finished: 设置结果回调
- (void)setBrand:(NSString *)brand completation:(void (^)(BOOL isSuccess,NSError *error))finished {
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// 设置录音模式
- (void)setRecordMode:(int)mode completation:(void (^)(BOOL isSuccess,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// 设置长按滚轮弹出的网页地址
- (void)setUrl:(NSString *)url completation:(void (^)(BOOL isSuccess,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// 设置长按滚轮弹出网页开关
- (void)setUrlState:(int)state completation:(void (^)(BOOL isSuccess,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// 设置鼠标连接模式
- (void)setMouseMode:(int)mode completation:(void (^)(BOOL isSuccess,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// 获取录音模式
- (void)getRecordMode:(void (^)(int mode,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// 获取长按滚轮弹出的网页地址
- (void)getUrl:(void (^)(NSString *url,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// 获取长按滚轮弹出的网页地址开关状态
- (void)getUrlState:(void (^)(int state,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// 获取鼠标连接模式
- (void)getMouseModel:(void (^)(int mode,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// 打开录音
- (void)openRecord:(void (^)(BOOL isSuccess,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
/// 关闭录音
- (void)closeRecord:(void (^)(BOOL isSuccess,NSError *error))finished{
+ if (self.productType == AiMouseProductType_keyboard) {
+ finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
+ return;
+ }
if (self.productType == AiMouseProductType_n) {
finished(false,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"当前鼠标不支持该接口"}]);
return;
- (void)nMouseAddLog:(NSString *)log{
[self showLog:log];
}
+#pragma mark - keyboardDelegate
+/// 设备连接状态
+/// - Parameter connected: 是否连接
+- (void)keyboardConnectStateDidChange:(BOOL)connected{
+ [self showLog:[NSString stringWithFormat:@"%@设备连接状态返回: %@",self.kbSdk.connectType == AiMouseConnectType_bluetooth ? @"键盘 蓝牙 ":@"键盘 USB",connected ? @"true":@"false"]];
+
+ if (self.aiMouseConnectStateDidChangeCallBack) {
+ self.aiMouseConnectStateDidChangeCallBack(self.kbSdk.connectType == AiMouseConnectType_bluetooth ? 0:1,connected);
+ }
+ if(self.authCallBack && connected)self.authCallBack(connected);
+}
+
+
+/// 设备信息数据回调,需要将此数据通过设备信息特征转发给蓝牙设备
+/// - Parameter data: 数据
+- (void)keyboardSendDeviceInfoData:(NSData *)data{
+ if (self.kbSdk.connectType == AiMouseConnectType_bluetooth) {
+ [self.ble writeToDevice:data];
+ }
+ else if (self.kbSdk.connectType == AiMouseConnectType_hid){
+ [self.hid writeToDevice:data];
+ }
+}
+
+/// 鼠标按键指令回调
+- (void)keyboardSendCmdData:(NSData *)data{
+ [self showLog:[NSString stringWithFormat:@"键盘按下 : %@",data]];
+}
+
+/// 输出sdk日志
+/// - Parameter log: 日志
+- (void)keyboardAddLog:(NSString *)log{
+ [self showLog:log];
+}
#pragma mark - AiMouseDelegate
/// 设备连接状态
/// - Parameter connected: 是否连接
[self showLog:[NSString stringWithFormat:@"录音保存成功 path = %@",fullPath]];
}
}
+
+
@end
#pragma mark - Hid CallBack
/// 匹配到设备回调
static void hidAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) {
- if ([DeviceManger shared].isConneted) {
-// [[HidManager shared] showLog:(@"当前处于连接状态,对监听到有USB 插入 的事件不做处理")];
- return;
- }
-// 1ea7 0064
+// if ([DeviceManger shared].isConneted) {
+// // [[HidManager shared] showLog:(@"当前处于连接状态,对监听到有USB 插入 的事件不做处理")];
+// return;
+// }
+ // 1ea7 0064
uint32_t pid = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDProductIDKey));
uint32_t vid = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDVendorIDKey));
uint32_t PrimaryUsagePage = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDPrimaryUsagePageKey));
uint32_t PrimaryUsage = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDPrimaryUsageKey));
-// [[HidManager shared] showLog: inIOHIDDeviceRef];
-
+ // [[HidManager shared] showLog: inIOHIDDeviceRef];
- if((vid == 0x1ea7 && pid == 0x0064)
- || (vid == 0x1ea7 && pid == 0x0066)
- || (vid == 0x32c2 && pid == 0x0066)
+ if((vid == 0x248a && pid == 0x6092)
){
-// 现在确认是这三款:
-// VID 0x1EA7 PID 0x0064
-// VID 0x1EA7 PID 0x0066
-// VID 0x32C2 PID 0x0066
+ [[HidManager shared] showLog:([NSString stringWithFormat:@"发现键盘%@,pid = %d,vid = %d ,page = %d, usage = %d",inIOHIDDeviceRef,pid,vid,PrimaryUsagePage,PrimaryUsage])];
+ [HidManager shared].productType = AiMouseProductType_keyboard;
+ [HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
+ //注册消息回调
+ unsigned char InputBuffer[64];
+ IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), &hidReceiveData, NULL);
+
+ IOReturn result = IOHIDDeviceOpen([HidManager shared].deviceInfoCha, kIOHIDOptionsTypeNone);
+ if (result != kIOReturnSuccess) {
+ [[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备失败! %d",result]];
+ [[AiDeviceAuthManager shared] showHidAlert];
+ return;
+ }else{
+ [[HidManager shared] showLog:@"打开设备成功!"];
+ [HidManager shared].connectStateCallBack(true) ;
+ }
+ return;
+ }
+ else if((vid == 0x1ea7 && pid == 0x0064)
+ || (vid == 0x1ea7 && pid == 0x0066)
+ || (vid == 0x32c2 && pid == 0x0066)
+ ){
+ // 现在确认是这三款:sdsdsdsffg`
+ // VID 0x1EA7 PID 0x0064
+ // VID 0x1EA7 PID 0x0066
+ // VID 0x32C2 PID 0x0066
[[HidManager shared] showLog:([NSString stringWithFormat:@"发现设备%@,pid = %d,vid = %d ,page = %d, usage = %d",inIOHIDDeviceRef,pid,vid,PrimaryUsagePage,PrimaryUsage])];
[HidManager shared].productType = AiMouseProductType_n;
[[HidManager shared] showLog:@"打开设备成功!"];
[HidManager shared].connectStateCallBack(true) ;
}
-// CFRetain([HidManager shared].deviceInfoCha);
-// IOHIDDeviceScheduleWithRunLoop([HidManager shared].deviceInfoCha, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ // CFRetain([HidManager shared].deviceInfoCha);
+ // IOHIDDeviceScheduleWithRunLoop([HidManager shared].deviceInfoCha, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
}
else if(vid == 0x6675 && pid == 0x8601){
[HidManager shared].productType = AiMouseProductType_frk;
[[AiDeviceAuthManager shared] showHidAlert];
return;
}else{
-// CFRetain(inIOHIDDeviceRef);
-// IOHIDDeviceScheduleWithRunLoop(inIOHIDDeviceRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ // CFRetain(inIOHIDDeviceRef);
+ // IOHIDDeviceScheduleWithRunLoop(inIOHIDDeviceRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
[HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
[[HidManager shared] showLog:@"打开设备信息成功!"];
return;
return;
}else{
-// CFRetain(inIOHIDDeviceRef);
-// IOHIDDeviceScheduleWithRunLoop(inIOHIDDeviceRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ // CFRetain(inIOHIDDeviceRef);
+ // IOHIDDeviceScheduleWithRunLoop(inIOHIDDeviceRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
[HidManager shared].voiceCha = inIOHIDDeviceRef;
[[HidManager shared] showLog:@"打开设备voice成功!"];
static void hidReceiveData(void* context, IOReturn result, void* sender, IOHIDReportType type, uint32_t reportID, uint8_t *report,CFIndex reportLength){
NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
-// [[HidManager shared] showLog:[NSString stringWithFormat:@"receive = %@",data]];
- if([HidManager shared].productType == AiMouseProductType_n){
-// if (report[0] == 0x01 || report[0] == 0x02) {
-// //鼠标键盘活动事件
-// return;
-// }
+ [[HidManager shared] showLog:[NSString stringWithFormat:@"receive = %@",data]];
+ if([HidManager shared].productType == AiMouseProductType_keyboard){
uint32_t primaryUsagePage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsagePageKey));
uint32_t primaryUsage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsageKey));
-
-// if(primaryUsagePage == 65461 && primaryUsage == 1){
-// if(primaryUsage == 1){
- NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
- [HidManager shared].receiveInfoDataCallBack(data);
-// }
+ NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
+ [HidManager shared].receiveInfoDataCallBack(data);
+ }
+ else if([HidManager shared].productType == AiMouseProductType_n){
+ uint32_t primaryUsagePage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsagePageKey));
+ uint32_t primaryUsage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsageKey));
+ NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
+ [HidManager shared].receiveInfoDataCallBack(data);
}
else if([HidManager shared].productType == AiMouseProductType_tlw){
if (report[0] == 0x01 || report[0] == 0x02) {
if(primaryUsagePage == 1 && primaryUsage == 2){
NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
-// [[HidManager shared] showLog:[NSString stringWithFormat:@"receive = %@",data]];
+ // [[HidManager shared] showLog:[NSString stringWithFormat:@"receive = %@",data]];
[HidManager shared].receiveInfoDataCallBack(data);
}
}
else{
NSData *data1 = [[NSData alloc] initWithBytes:report length:reportLength];
-// [[HidManager shared] showLog:[NSString stringWithFormat:@"receive = %@",data1]];
+ // [[HidManager shared] showLog:[NSString stringWithFormat:@"receive = %@",data1]];
NSInteger len = get_data_len(report, reportLength);
NSData *data = [[NSData alloc] initWithBytes:report length:len];
[self showLog:@"关闭hid"];
-// if (self.deviceInfoCha ) {
-// IOReturn result = IOHIDDeviceSetReport(self.deviceInfoCha, kIOHIDReportTypeInput, 0, NULL, 0);
-// if (result!= kIOReturnSuccess) {
-// [self showLog:(@"关闭deviceInfoCha 失败!")];
-// return;
-// }
-// }
-// if (self.voiceCha ) {
-// IOReturn result = IOHIDDeviceSetReport(self.voiceCha, kIOHIDReportTypeInput, 0, NULL, 0);
-// if (result!= kIOReturnSuccess) {
-// [self showLog:(@"关闭 voiceCha 失败!")];
-// return;
-// }
-// }
+ // if (self.deviceInfoCha ) {
+ // IOReturn result = IOHIDDeviceSetReport(self.deviceInfoCha, kIOHIDReportTypeInput, 0, NULL, 0);
+ // if (result!= kIOReturnSuccess) {
+ // [self showLog:(@"关闭deviceInfoCha 失败!")];
+ // return;
+ // }
+ // }
+ // if (self.voiceCha ) {
+ // IOReturn result = IOHIDDeviceSetReport(self.voiceCha, kIOHIDReportTypeInput, 0, NULL, 0);
+ // if (result!= kIOReturnSuccess) {
+ // [self showLog:(@"关闭 voiceCha 失败!")];
+ // return;
+ // }
+ // }
IOReturn ret = IOHIDManagerClose(self.hidManager, 0);
self.hidManager = nil;
if (ret != kIOReturnSuccess) {
[self showLog:[NSString stringWithFormat:@"发送失败! code = %d",ret]];
}else{
-// [self showLog:@"发送成功!"];
+ // [self showLog:@"发送成功!"];
}
}
--- /dev/null
+//
+// MSUtilis.h
+// AiMouseManager
+//
+// Created by incar on 2024/11/18.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MSUtilis : NSObject
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// MSUtilis.m
+// AiMouseManager
+//
+// Created by incar on 2024/11/18.
+//
+
+#import "MSUtilis.h"
+
+@implementation MSUtilis
+
+@end
// [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
// [[NSRunLoop currentRunLoop] run];
// });
- self.timer = [NSTimer scheduledTimerWithTimeInterval:8 target:self selector:@selector(timerAction) userInfo:nil repeats:true];
+ self.timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:true];
}
- (void)timerAction{
</Locations>
</BreakpointContent>
</BreakpointProxy>
+ <BreakpointProxy
+ BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+ <BreakpointContent
+ uuid = "53D53521-E33F-4B1C-B350-00C481F224D4"
+ shouldBeEnabled = "Yes"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ filePath = "AiMouseSdk/Keyboard/KeyboardSdk.m"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "142"
+ endingLineNumber = "142"
+ landmarkName = "-getDeviceInfo:"
+ landmarkType = "7">
+ </BreakpointContent>
+ </BreakpointProxy>
</Breakpoints>
</Bucket>
dispatch_async(dispatch_get_main_queue(), ^{
ws.authLabel.stringValue = isSuccess?@"鉴权状态:鉴权成功":@"鉴权状态:鉴权失败";
if(isSuccess){
- [ws geviceInfoAction];
+ [ws geviceInfoAction];
}
});
};
}
- (void)setUrlState:(NSMenuItem*)sender{
- [[DeviceManger shared] setUrlState:1 completation:^(BOOL isSuccess, NSError * _Nonnull error) {
+ [[DeviceManger shared] setUrlState:0 completation:^(BOOL isSuccess, NSError * _Nonnull error) {
NSLog(isSuccess? @"设置滚轮开关成功":@"设置滚轮开关失败");
}];
}