iOS 蓝牙开发(二)

前期回顾

iOS 蓝牙开发(一)
iOS 蓝牙开发(三)
iOS 蓝牙开发(四)

上一篇文章我们简单记录了如何扫描周边设备、如何链接指定外设等基本操作,本期我们重点记录如何获取外设的服务和特征。

连接外设

#pragma mark - CBCentralManagerDelegate & CBCentralManagerDelegate
// 扫描外设
// 在蓝牙于后台被杀掉时,重连之后会首先调用此方法,可以获取蓝牙恢复时的各种状态
- (void)centralManager:(CBCentralManager *)central
 didDiscoverPeripheral:(CBPeripheral *)peripheral
     advertisementData:(NSDictionary *)advertisementData
                  RSSI:(NSNumber *)RSSI
{
    // 该代理方法会实时被调用,在该函数中筛选出指定的周边外设,最后根据这里赛选出的函数进行连接。
}

// 成功
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral  {
     NSLog(@"连接到名称为(%@)的设备-成功",peripheral.name);
}

// 失败
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
      NSLog(@"连接到名称为(%@)的设备-失败,原因:%@",[peripheral name],[error localizedDescription]);
 }

// 断开连接
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
       NSLog(@"外设连接断开连接 %@ \n", [peripheral name]);
  }
  • 获取外设服务与特征流程


    蓝牙发送服务与特征数据的流程图

从上图可以看出发送连接请求后,就会调用代理函数的回调,连接外设成功后,就可以获取到对应外设CBPeripheral的service数组,从外设的内部结构可以看出,每一个外设可以有一个或多个service服务(它是个数组CBServices),每个CBServices又包含一个或多个特征(CBCharacteristic)也是个数组。所以外设的代理函数(CBPeripheralDelegate)中即包含了主设备与外设交互的大多回调,即可根据对应回调获取到服务services、特征(characteristics)、rssi等数据。

  • 实现函数(重点看函数中的注释)
    中心设备的代理方法
// 蓝牙设备连接成功
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
// 调用这个函数后就会进入外设的代理函数去获取对应的CBServices和characteristics
    [self.peripheral discoverServices:nil];
}

外设的代理方法

//获取特征后的回调
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    if (error) {
        NSLog(@"didDiscoverCharacteristicsForService error : %@", [error localizedDescription]);
        return;
    }
    
  // 筛选自己需要的特征
    [self createCharacticWithPeripheral:peripheral service:service];
}

//打印出 characteristic 的权限,可以看到有很多种,
//这是一个NS_OPTIONS,就是可以同时用于好几个值,
//常见的有read,write,notify,indicate,知知道这几个基本就够用了,
//前连个是读写权限,后两个都是通知,两种不同的通知方式。
        /*
         typedef NS_OPTIONS(NSUInteger, CBCharacteristicProperties) {
         CBCharacteristicPropertyBroadcast                                              = 0x01,
         CBCharacteristicPropertyRead                                                   = 0x02,
         CBCharacteristicPropertyWriteWithoutResponse                                   = 0x04,
         CBCharacteristicPropertyWrite                                                  = 0x08,
         CBCharacteristicPropertyNotify                                                 = 0x10,
         CBCharacteristicPropertyIndicate                                               = 0x20,
         CBCharacteristicPropertyAuthenticatedSignedWrites                              = 0x40,
         CBCharacteristicPropertyExtendedProperties                                     = 0x80,
         CBCharacteristicPropertyNotifyEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0)        = 0x100,
         CBCharacteristicPropertyIndicateEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0)  = 0x200
         };

总结:
本章笔记主要是梳理如何获取外设中的服务数组和特征数组。重点是在于要明白当连接成功后,就会调用[self.peripheral discoverServices:nil];从而去回调外设peripheral的代理方法- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error, 在外设的方法中获取到外部设备的传递的服务和特征。

你可能感兴趣的:(iOS 蓝牙开发(二))