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 }
原文地址:https://www.cnblogs.com/Rinpe/p/4755184.html