前期回顾
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
, 在外设的方法中获取到外部设备的传递的服务和特征。