1、蓝牙技术基于 <CoreBluetooth/CoreBluetooth.h>框架,框架分为管理中心(使用手机等管理其他设备)和外设(被管理的设备,如门禁,家电)两部分,管理中心-CBCentralManager,外设-CBPeripheralManager;
2、蓝牙开发的逻辑流程
打开蓝牙,本机搜索附近能被搜索的外设,或者按一定的uuid搜索外设,搜索到外设后尝试和某个外设进行连接,然后对外设进行深层扫描,进行数据解析,读取到外设的数据(心率获取)以及写入外设的数据(硬件控制),实现功能。
3、创建管理中心
1)创建对象
- (instancetype)init;
//普通的创建方法
- (instancetype)initWithDelegate:(nullable id<CBCentralManagerDelegate>)delegate
queue:(nullable dispatch_queue_t)queue;
//使用多线程在新建线程创建,避免卡顿,并使用代理进行数据获取
- (instancetype)initWithDelegate:(nullable id<CBCentralManagerDelegate>)delegate
queue:(nullable dispatch_queue_t)queue
options:(nullable NSDictionary<NSString *, id> *)options NS_AVAILABLE(NA, 7_0) NS_DESIGNATED_INITIALIZER;
//options参数是一个搜索的配置参数,该参数的具体配置,自己了解还不是很清楚,平时一般出入nil就可以了
2)开始搜索周围设备
管理中心代理有个必选代理
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
可以获取到本设备的蓝牙状态信息,在蓝牙已打开的情况下,
调用- (void)scanForPeripheralsWithServices:(nullable NSArray<CBUUID *> *)serviceUUIDs options:(nullable NSDictionary<NSString *, id> *)options;
方法对周边的外设进行扫描,
触发代理- (void)centralManager:(CBCentralManager *)central
didDiscoverPeripheral:(CBPeripheral *)peripheral
advertisementData:(NSDictionary<NSString *,id> *)advertisementData
RSSI:(NSNumber *)RSSI ,
在代理里面就可以获取到设备扫描到的外设,一个一个的响应触发代理,然后在通过外设的属性参数的选出自己需要的一个外设
3)管理中心连接外设
然后使用
• (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;
用管理中心对外设进行链接,链接外设后触发代理
• (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
可以获取到自己链接外设有没有成功,获取到外设的一些参数
4)对选定的外设进行深度扫描
在代理里面获取到外设,对外设代理进行设置,然后扫描外设
• (void)discoverServices:(nullable NSArray<CBUUID *> *)serviceUUIDs;,
扫描成功后会触发代理方法
• (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error
然后我们就可以在代理方法中获取到外设的的服务特性service
for (CBService *service in peripheral.services)
然后扫描外设的service,
- (void)discoverCharacteristics:(nullable NSArray<CBUUID *> *)characteristicUUIDs forService:(CBService *)service;//[peripheral discoverCharacteristics:nil forService:service];
触发代理
• (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error
可以获取到外设的服务特性service的Characteristic特征的值,然后
for (CBCharacteristic *characteristic in service.characteristics)
{
// NSLog(@"扫描到服务:%@ 的特征:%@", service.UUID, characteristic.UUID);
//读取获取Characteristic特征的值
[peripheral readValueForCharacteristic:characteristic];
// 搜索特征的 Descriptors
//会触发代理 peripheral:didDiscoverDescriptorsForCharacteristic:error:发现特征描述符
[peripheral discoverDescriptorsForCharacteristic:characteristic];
}
5)写入数据
通过触发的深度扫描的代理方法,扫描获取数据信息,对信息进行处理,然后在外设上写入自己想要写入的信息
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error
{
//订阅实时通知,触发didUpdateNotificationStateForCharacteristic代理方法
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
for (CBDescriptor *descriptor in characteristic.descriptors) {
// 获取到 描述符Descriptors 的值,将会触发代理didUpdateValueForDescriptor
[peripheral readValueForDescriptor:descriptor];
if (characteristic.properties & CBCharacteristicPropertyWrite ||
characteristic.properties & CBCharacteristicPropertyWriteWithoutResponse) {
// 写数据
[peripheral writeValue:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://www.baidu.com"]] forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
} else {
NSLog(@"该字段不可写!");
}
}
}