CoreBluetooth
Core Bluetooth的基本常识
每个蓝牙4.0设备都是通过服务(Service)和特征(Characteristic)来展示自己的
一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征
特征是与外界交互的最小单位
比如说,一台蓝牙4.0设备,用特征A来描述自己的出厂信息,用特征B来收发数据
服务和特征都是用UUID来唯一标识的,通过UUID就能区别不同的服务和特征
设备里面各个服务(service)和特征(characteristic)的功能,均由蓝牙设备硬件厂商提供,比如哪些是用来交互(读写),哪些可获取模块信息(只读)等
******************************************************************************************
Core Bluetooth的开发步骤
建立中心设备
扫描外设(Discover Peripheral)
连接外设(Connect Peripheral)
扫描外设中的服务和特征(Discover Services And Characteristics)
利用特征与外设做数据交互(Explore And Interact)
断开连接(Disconnect)
1 #import "ViewController.h" 2 #import <CoreBluetooth/CoreBluetooth.h> 3 4 @interface ViewController () <CBCentralManagerDelegate, CBPeripheralDelegate> 5 /** 6 * 外设 7 */ 8 @property (nonatomic, strong) NSMutableArray *peripherals; 9 /** 10 * 中心管理者 11 */ 12 @property (nonatomic, strong) CBCentralManager *mgr; 13 @end 14 15 @implementation ViewController 16 17 #pragma mark - 懒加载 18 // 1.创建中心设备管理对象 19 - (CBCentralManager *)mgr 20 { 21 if (_mgr == nil) { 22 _mgr = [[CBCentralManager alloc] init]; 23 _mgr.delegate = self; 24 } 25 return _mgr; 26 } 27 28 - (NSMutableArray *)peripherals 29 { 30 if (_peripherals == nil) { 31 _peripherals = [NSMutableArray array]; 32 } 33 return _peripherals; 34 } 35 36 #pragma mark - 系统方法 37 - (void)viewDidLoad { 38 [super viewDidLoad]; 39 40 // 2.扫描外设 41 [self.mgr scanForPeripheralsWithServices:nil options:nil]; 42 } 43 44 /** 45 * 模拟点击, 连接外设 46 */ 47 - (void)start 48 { 49 for (CBPeripheral *peripheral in self.peripherals) { 50 // 4.连接设备 51 [self.mgr connectPeripheral:peripheral options:nil]; 52 } 53 } 54 55 56 #pragma mark - CBCentralManagerDelegate 57 /** 58 * 扫描到外设的时候调用 59 * 60 * @param central 中心设备管理对象 61 * @param peripheral 外设 62 */ 63 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 64 { 65 // 3.保存外设 66 if (![self.peripherals containsObject:peripheral]) { 67 peripheral.delegate = self; 68 [self.peripherals addObject:peripheral]; 69 } 70 71 } 72 73 /** 74 * 连接到外设的时候调用 75 * 76 * @param central 中心设备管理对象 77 * @param peripheral 外设 78 */ 79 - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral 80 { 81 // 5.扫描外设中的服务 82 [peripheral discoverServices:nil]; 83 } 84 85 86 #pragma mark - CBPeripheralDelegate 87 /** 88 * 只要扫描到服务就会调用 89 * 90 * @param peripheral 服务所在的外设 91 */ 92 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error 93 { 94 95 for (CBService *service in peripheral.services) { 96 if ([service.UUID.UUIDString isEqualToString:@"123"]) { 97 // 6.扫描指定服务的特征 98 [peripheral discoverCharacteristics:nil forService:service]; 99 } 100 } 101 } 102 103 /** 104 * 发现特征时调用 105 * 106 * @param peripheral 外设 107 * @param service 服务 108 */ 109 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error 110 { 111 for (CBCharacteristic *characteristic in service.characteristics) { 112 // 获取指定特征后进行数据交互 113 if ([characteristic.UUID.UUIDString isEqualToString:@"888"]) { 114 NSLog(@"设置闹钟"); 115 // 7.停止扫描 116 [self.mgr stopScan]; 117 } 118 } 119 }