一、初始化中心设备对象
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
二、扫描外设
1、扫描
[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:服务UUID字符串]] options:nil];
2、扫描到设备
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary*)advertisementData RSSI:(NSNumber *)RSSI;
参数:
central:中心设备
peripheral:扫描到外设
advertisementData:广播数据(设备名称、设备uuid、设备Mac地址)
RSSI:表示外围设备信号强度
三、连接设备
1、连接设备
[self.centralManager connectPeripheral:peripheral options:@{
CBConnectPeripheralOptionNotifyOnConnectionKey: @YES,
CBConnectPeripheralOptionNotifyOnDisconnectionKey: @YES,
CBConnectPeripheralOptionNotifyOnNotificationKey: @YES,
}];
CBConnectPeripheralOptionNotifyOnConnectionKey:如果应用被挂起时,连接某设备成功,系统给予连接成功提示。
CBConnectPeripheralOptionNotifyOnDisconnectionKey:如果应用被挂起时,设备连接断开,系统给予设备断开提示。
CBConnectPeripheralOptionNotifyOnNotificationKey:如果应用被挂起时,从设备接收到的所有信息通知,系统给予提示。
2、连接"成功"
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;
此时只是蓝牙层连接成功,尚未发现设备服务,不可以进行读写指令操作。此处不能算是真正意义上的连接成功状态。
在该方法内寻找设备对应的服务
//寻找指定UUID的Service
[peripheral discoverServices:@[[CBUUID UUIDWithString:指定服务UUID]]];
3、发现服务
//发现服务时调用的方法
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error;
发现服务,在该回调方法内扫描服务对应的特征值。即:
//寻找指定UUID的Characteristic
for (CBService *service in peripheral.services) {
[peripheral discoverCharacteristics:nil forService:service];
}
4、发现服务特征值
//发现服务的特征值后回调的方法
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
扫描到对应的读写特征值。存储起来。并将设备的状态置为连接成功状态,即:
//遍历服务对应所有特征值
for (CBCharacteristic *characteristic in service.characteristics) {
//判断是不是需要的读服务UUID
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:读服务UUID]]) {
//读服务UUID,则订阅该服务
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
//存储起来
self.readCharacteristic = characteristic;
} else if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:写服务UUID]]) {
//存储起来
self.writeCharacteristic = characteristic;
}
}
5、连接失败
//连接外设失败
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;
四、指令交互
1、发送指令
[self.peripheral writeValue:chunk forCharacteristic:self.writeCharacteristic type:CBCharacteristicWriteWithResponse];
2、读取数据
//特征值更新时回调的方法
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error;
该方法内进行数据的拼接。
五、断开连接
1、断开连接
[self.centralManager cancelPeripheralConnection:peripheral];
2、断开连接成功回调
//断开外设连接
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;
本文主要对扫描设备,扫描服务、连接设备、断开连接的整体流程,以及需要注意的地方简单梳理,如果对你有帮助,点击下方喜欢呦。下一章节将着重介绍CBCentralManager。
网友评论