使用流程
1、初始化CBCentralManager。
在初始化的时候需要传入两个参数:
第一个参数设置Delegate一般我们设置成self;
第二个需要传入一个队列,出入的不是主队列的话,那我们接收的时候也要在传入的队列里面才能接收到对应的值,所以一般第二个参数可以直接出入nil
或者dispatch_get_main_queue()
2、实现代理方法
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
在该代理方法里面主要监听设备当前的蓝牙状态,根据蓝牙的状态来判断是否进行下一步的操作,状态主要返回如下内容:
CBCentralManagerStateUnknown = 0,//当前状态不明确
CBCentralManagerStateResetting,//
CBCentralManagerStateUnsupported,//该设备不支持
CBCentralManagerStateUnauthorized,//未被授权
CBCentralManagerStatePoweredOff,//蓝牙关闭状态
CBCentralManagerStatePoweredOn,//蓝牙开启状态
3、搜索周围的蓝牙设备调用
- (void)scanForPeripheralsWithServices:(nullable NSArray<CBUUID *> *)serviceUUIDs options:(nullable NSDictionary<NSString *, id> *)options
调用该方法的中心就不断的搜索周围的蓝牙设备,需要传入两个参数:
第一个参数是对应设备的UUID,如果出入nil
就搜索周围的所有设备,如果出入了指定的UUID就只搜索出入的设备;
第二个参数是一个搜索的配置参数,该参数的具体配置,自己了解还不是很清楚,平时一般出入nil
就可以了
4、在调用搜索周围设备的方法之后需要同时实现以下的代理方法
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
该代理方法里面四个参数主要的意思是:
第一个参数是当前的中心
第二个参数是对应的设备
第三个参数是对应设备蓝牙广播出来的信息
第四个参数是设备的蓝牙信号强度
其中我们主要使用到的是第二个参数,也就是发现的设备
5、得到了对应设备之后就要开始连接设备,连接设备我们调用
- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;
在该方法中我们很明显的看出第一个参数是需要出入一个设备,那么我们就将刚刚发现的设备出入一个进去,第二个参数是需要出入一个字典属性,我这里一般出入的是@{ CBCentralManagerScanOptionAllowDuplicatesKey:@YES }
其他属性我没有具体使用,有时间大家一起研究研究。
6、连接设备的时候同时也要实现以下两个代理方法
-(void)centralManager:(nonnull CBCentralManager *)central didDisconnectPeripheral:(nonnull CBPeripheral *)peripheral error:(nullable NSError *)error
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
在这两个代理方法里面,第一个方法是连接发生错误的时候调用的;第二个方法是两节成功之后会调用的,当调用成功之后会返回连接成功对应的中心和设备,这个时候我们要设置设备的代理因为检索设备的服务和服务下面对应的特征的时候都是通过代理的方式实现的
self.ConnectionDevice = peripheral;
self.ConnectionDevice.delegate = self;//设置对应的代理
7、通过连接成功的设备调用以下方法发现该设备下面的服务
- (void)discoverServices:(nullable NSArray<CBUUID *> *)serviceUUIDs;
该方法可以传入一个服务的UUID如果出入了对应的UUID之后就之后搜索对应UUID的服务。
8、调用发现服务方法的同时还需要实现对应的代理方法
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error;
第一个参数是对应的设备,该设备下面有一个peripheral.services
属性,通过该属性能够得到该设备下面的所有服务,
第二个参数就是对应的错误信息,当发生错误的时候我们需要做对应的处理
9、得到对应服务之后通过设备调用以下方法发现服务下面对应的特征
- (void)discoverCharacteristics:(nullable NSArray<CBUUID *> *)characteristicUUIDs forService:(CBService *)service;
第一个参数指定对应特征的UUID,如果传入则只搜索对应UUID的特征
第二个参数传入需要搜索特征的服务
10、调用发现特征方法的时候还需要实现
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error;
这个代理方法会得到一个CBService在这个下面有一个service.characteristics
这个属性里面有该服务下面所有的特征,我们就可以获取到特征了。
到此我们就已经连接了对应的设备,并拿到了对应设备下面的服务和特征了,为我们后面的蓝牙读写操作做好了基础了。
读写操作
1、写入操作调用以下方法实现
- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;
第一个参数是需要写入的数据
第二个参数是对应写入的特征
第三个参数是对应写入的类型一般是CBCharacteristicWriteWithResponse
和CBCharacteristicWriteWithoutResponse
这两个类型
2、设置通知监听,调用以下方法实现
- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;
第一个参数一般情况设置成YES
第二个参数是需要监听的对应特征
3、读取对应特征下面的值,调用
- (void)readValueForCharacteristic:(CBCharacteristic *)characteristic;
该方法只需要传入需要读取的特征就OK了
4、在设置通知和读取值的时候记得一定要实现以下代理方法
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;
该代理方法在收到通知或者读取到值的时候都会调用,通过characteristic.value
我们就得到了想要的值了。
网友评论