1.接入流程
1.1 支持环境
环境 |
兼容范围 |
备注 |
---|---|---|
软件系统 |
目标版本:IOS 11.0 |
支持BLE功能 |
固件SDK |
AC693NSDK, AC695NSDK,AC697NSDK等 |
建议咨询SDK负责人 |
开发工具 |
Xcode 13.0以上 |
建议使用最新版本 |
1.2 库导入
1.2.1 依赖库
1.2.2 导入库
JL_BLEKit.framework : 蓝牙功能库
JL_OTALib.framework : OTA升级业务库
JL_AdvParse.framework : 杰理蓝牙设备广播包解析业务库
JL_HashPair.framework : 设备认证业务库
1.2.3 必要权限
//使用蓝牙权限
Privacy - Bluetooth Peripheral Usage Description
Privacy - Bluetooth Always Usage Description
1.2.4 Xcode 配置
由于库里包含了扩展类的属性,需要在使用时配置 Other linker Flags
需要在工程的 Build Settings 中的 Other Linker Flags 添加 -ObjC。
1.3 SDK配置
1.3.1 蓝牙初始化
1//1、外部的引用
2@property(strong,nonatomic) JL_BLEMultiple *mBleMultiple;
3@property(weak ,nonatomic) JL_EntityM *mBleEntityM; //需要Weak引用,断开设备重新搜索,SDK需释放。(作为当前正在操作的设备使用)
4@property(strong,nonatomic) NSString *mBleUUID;
5@property(weak ,nonatomic) NSArray *mFoundArray; //需要Weak引用,扫描到的设备。
6@property(weak ,nonatomic) NSArray *mConnectedArray;//需要Weak引用,已连接的设备。
7
8//2、实例化SDK
9self.mBleMultiple = [[JL_BLEMultiple alloc] init];
10self.mBleMultiple.BLE_FILTER_ENABLE = YES; //过滤设备使能
11self.mBleMultiple.BLE_PAIR_ENABLE = YES; //配对使能
12self.mBleMultiple.BLE_TIMEOUT = 7; //连接超时时间
13
14//3、选择需要搜索设备类型
15self.mBleMultiple.bleDeviceTypeArr = @[@(JL_DeviceTypeWatch)];//只选Watch
16
17//4、SDK搜索到的设备,点击连接后,会加入bleConnectedArr数组中。
18//5、调用[self.mBleMultiple scanStart]会释放掉blePeripheralArr的JL_EntityM。
19self.mFoundArray = self.mBleMultiple.blePeripheralArr;
20
21//6、SDk已连接上的设备,断开连接后,会加入blePeripheralArr数组中。
22self.mConnectedArray = self.mBleMultiple.bleConnectedArr;
23
24//7、用mBleEntityM弱引用mConnectedArray中已连接的一个JL_EntityM设备,此后会用mBleEntity到内的【JL_ManagerM】发命令。
1.3.2 连接设备
1//从已发现的设备列表里连接一个。
2JL_EntityM *entity = self.mFoundArray[indexPath.row];
3/**
4连接设备
5@param entity 蓝牙设备类
6*/
7[self.mBleMultiple connectEntity:entity
8 Result:^(JL_EntityM_Status status) {
9 [JL_Tools mainTask:^{
10 /*【status】错误码与错误原因
11 JL_EntityM_StatusBleOFF = 0, //BLE蓝牙未开启
12 JL_EntityM_StatusConnectFail = 1, //BLE连接失败
13 JL_EntityM_StatusConnecting = 2, //BLE正在连接
14 JL_EntityM_StatusConnectRepeat = 3, //BLE重复连接
15 JL_EntityM_StatusConnectTimeout = 4, //BLE连接超时
16 JL_EntityM_StatusConnectRefuse = 5, //BLE被拒绝
17 JL_EntityM_StatusPairFail = 6, //配对失败
18 JL_EntityM_StatusPairTimeout = 7, //配对超时
19 JL_EntityM_StatusPaired = 8, //已配对
20 JL_EntityM_StatusMasterChanging = 9, //正在主从切换
21 JL_EntityM_StatusDisconnectOk = 10, //已断开成功
22 JL_EntityM_StatusNull = 11, //Entity为空 */
23
24 if (status == JL_EntityM_StatusPaired) {
25 NSString *txt = [NSString stringWithFormat:@"连接成功:%@",deviceName];
26 }else{
27 NSString *txt = [NSString stringWithFormat:@"连接失败:%@",deviceName];
28 }
29 }];
30}];
31
32/*--- 注意事项
33//mBleEntityM在文档1.3.1里有介绍;
34//连接成功后必须先获取设备信息;
35[self.mBleEntityM.mCmdManager cmdTargetFeatureResult:^(NSArray *array) {
36 JL_CMDStatus st = [array[0] intValue];
37 if (st == JL_CMDStatusSuccess) {
38 /*--- 设备信息的model ---*/
39 JLModel_Device *model = [self.mBleEntityM.mCmdManager outputDeviceModel];
40 NSLog(@"获取成功。");
41 }else{
42 NSLog(@"获取失败。");
43 }
44}];
1.3.3 断开设备
1/**
2连接设备
3@param entity 蓝牙设备类
4*/
5[self.mBleMultiple disconnectEntity:entity Result:^(JL_EntityM_Status status) {
6 [JL_Tools mainTask:^{
7 if (status == JL_EntityM_StatusDisconnectOk) {
8 NSString *txt = [NSString stringWithFormat:@"已断开:%@",deviceName];
9 }
10 }];
11}];
1.3.4 MAC地址回连设备
1[self.mBleMultiple connectEntityForMac:@"Mac地址" Result:^(JL_EntityM_Status status) {
2 [JL_Tools mainTask:^{
3 if (status == JL_EntityM_StatusPaired) {
4 NSLog(@"----> 回连设备成功。");
5 }else{
6 NSLog(@"----> 回连设备成功失败。");
7 }
8 }];
9}];
1.3.5 UUID回连设备
1//根据UUID找到对应的JL_EntityM连接。
2JL_EntityM *entity = [bleMp makeEntityWithUUID:@"UUID-xxxx-xxxx-xxxx-xxxx"];
3
4/*--- 1、直接UUID连接设备 ---*/
5[self.mBleMultiple connectEntity:entity Result:^(JL_EntityM_Status status){
6 [JL_Tools mainTask:^{
7 if (status == JL_EntityM_StatusPaired) {
8 NSLog(@"----> UUID回连设备成功。");
9 }else{
10 NSLog(@"----> 回连设备成功失败。");
11 }
12 }];
13}];
1.3.6 蓝牙连接成功后的初始化
1//收到kJL_BLE_M_ENTITY_CONNECTED通知,做以下处理:
2/*--- 关闭耳机信息推送 ---*/
3[self.mBleEntityM.mCmdManager.mTwsManager cmdHeadsetAdvEnable:NO];
4
5/*--- 同步时间戳 ---*/
6NSDate *date = [NSDate new];
7JL_SystemTime *systemTime = self.mBleEntityM.mCmdManager.mSystemTime;
8[systemTime cmdSetSystemTime:date];
9
10/*--- 清理设备音乐缓存 ---*/
11[self.mBleEntityM.mCmdManager.mFileManager cmdCleanCacheType:JL_CardTypeUSB];
12[self.mBleEntityM.mCmdManager.mFileManager cmdCleanCacheType:JL_CardTypeSD_0];
13[self.mBleEntityM.mCmdManager.mFileManager cmdCleanCacheType:JL_CardTypeSD_1];
14
15__weak typeof(self) wSelf = self;
16/*--- 获取设备信息 ---*/
17[self.mBleEntityM.mCmdManager cmdTargetFeatureResult:^(JL_CMDStatus status,uint8_t sn,NSData *_Nullable data){
18 JL_CMDStatus st = status;
19 if(st == JL_CMDStatusSuccess){
20 [wSelf startTimeout];
21
22 JLModel_Device *model = [wSelf.mBleEntityM.mCmdManager outputDeviceModel];
23 JL_OtaStatus upSt = model.otaStatus;
24 if(upSt == JL_OtaStatusForce){
25 wSelf.mBleEntityM.mBLE_NEED_OTA = YES;
26 return;
27}else{
28 if(model.otaHeadset == JL_OtaHeadsetYES){
29 wSelf.mBleEntityM.mBLE_NEED_OTA = YES;
30 return;
31 }
32}
33wSelf.mBleEntityM.mBLE_NEED_OTA = NO;
34
35/*--- 共有信息 ---*/
36 [wSelf.mBleEntityM.mCmdManager cmdGetSystemInfo:JL_FunctionCodeCOMMON Result:^(JL_CMDStatus status,uint8_t sn,NSData *_Nullable data){
37 [wSelf.mBleEntityM.mCmdManager cmdGetSystemInfo:JL_FunctionCodeBT Result:^(JL_CMDStatus status,uint8_t sn,NSData *_Nullable data){
38
39 }];
40 }];
41 }
42}];
1.3.7 监听发现、连接、断开、蓝牙状态等通知回调
1extern NSString *kJL_BLE_M_FOUND; //1、发现设备
2extern NSString *kJL_BLE_M_FOUND_SINGLE; //2、发现单个设备
3extern NSString *kJL_BLE_M_ENTITY_CONNECTED; //3、设备连接
4extern NSString *kJL_BLE_M_ENTITY_DISCONNECTED; //4、设备断开
5extern NSString *kJL_BLE_M_ON; //5、BLE开启
6extern NSString *kJL_BLE_M_OFF; //6、BLE关闭
7extern NSString *kJL_BLE_M_EDR_CHANGE; //7、经典蓝牙输出通道变化
8//监听第1、3、4点通知,查看mBleMultiple.blePeripheralArr数组元素变化,更新UI界面。
9//监听第5点通知,则知道当前经典蓝牙连接的变化,回调经典蓝牙信息:
10 @{@"ADDRESS":@"7c9a1da7330e", //经典蓝牙地址
11 @"TYPE" :@"BluetoothA2DPOutput", //类型
12 @"NAME" :@"earphone"} //名字