/* 建立中心设备 扫描外设(Discover Peripheral) 连接外设(Connect Peripheral) 扫描外设中的服务和特征(Discover Services And Charateristics) 利用特征与外设做数据交互(Explore And Interact) 断开连接(Disconnect) */#import "ViewController.h"#import@interface ViewController () @property (nonatomic, strong) CBCentralManager *mgr;/** 发现的外设数组*/@property (nonatomic, strong) NSMutableArray *peripheralArray;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // 1.建立中心设备 // queque:如果说你传空,在主队列 self.mgr = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; // 2.扫描外设 }- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // 最后一步,断开连接 [self.mgr stopScan];}#pragma CBCentralManagerDelegate/*state:CBManagerStateUnknown = 0, 未知CBManagerStateResetting, 重置CBManagerStateUnsupported, 不支持CBManagerStateUnauthorized, 未经授权CBManagerStatePoweredOff, 没有启动CBManagerStatePoweredOn, 开启 */- (void)centralManagerDidUpdateState:(CBCentralManager *)central { NSLog(@"state = %zd", central.state); // 蓝牙开启 if (central.state == CBManagerStateUnknown) { NSLog(@"未知的蓝牙"); } if (central.state == CBManagerStatePoweredOn) { // 2.扫描外设 [self.mgr scanForPeripheralsWithServices:nil options:nil]; }}/** 3.连接外设(Connect Peripheral) @param peripheral 外设 @param advertisementData 相关的二进制数据 @param RSSI 信号强度 */- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { // 1.记录外设,必须要有数组进来行存储 if ([self.peripheralArray containsObject:peripheral]) { [self.peripheralArray addObject:peripheral]; } // 2.隐藏步骤,tableview表格列表(省略了) // 3.连接外围设备 [self.mgr connectPeripheral:peripheral options:nil]; // 4.设置外设的代理 peripheral.delegate = self; }// 连接到外设之后,会调用这个代理方法- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { // 扫描服务 // 传nil代表扫描所有服务 [peripheral discoverServices:nil]; }#pragma CBPeripheralDelegate// 外设扫描里面的服务- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { // 获取外设的服务 for (CBService *service in peripheral.services) { if ([service.UUID.UUIDString isEqualToString:@"123"]) { // uuid一致,那就开始扫描特征 [peripheral discoverCharacteristics:nil forService:service]; } }}// 当发现到特征的时候会调用- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { // for (CBCharacteristic *characteristic in service.characteristics) { if ([characteristic.UUID.UUIDString isEqualToString:@"123456"]) { // [peripheral readValueForDescriptor:<#(nonnull CBDescriptor *)#>]; // [peripheral writeValue:<#(nonnull NSData *)#> forDescriptor:<#(nonnull CBDescriptor *)#>]; } }}- (NSMutableArray *)peripheralArray { if (!_peripheralArray) { _peripheralArray = [NSMutableArray array]; } return _peripheralArray;}