说明:苹果官方开发文档中涉及一些名词:Central(中心设备)、Peripheral(外围设备)、advertising(广告)、Services(服务)、Characteristic(特征)等,我都用括号内的中文进行翻译,并且不做详细解释,可能存在误导,请谅解。
目录:
步骤1.建立一个Central Manager实例进行蓝牙管理
步骤2.搜索外围设备
步骤3.连接外围设备
步骤4.获得外围设备的服务
步骤5.获得服务的特征
步奏6.从外围设备读数据(直接读取和订阅两种方法)
步骤7.给外围设备发送数据
步骤一.开启Central Manager
CBCentralManager 是Core Bluetooth的一个对象,代表一个本地中心设备,在使用任何蓝牙传输前,你必须给CBCentralManager实例分配内存和初始化。可以通过CBCentralManager类的 方法:
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Courier; color: rgb(102, 102, 102); -webkit-text-stroke-color: rgb(102, 102, 102); -webkit-text-stroke-width: initial;">myCentralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:nil];</p>
在这个例子中,self会被设置为接收所有中心设备角色的事件的代理,设置dispatch queue为nil后,central manager会通过主线程来处理这些事件。ViewController需要实现CBCentralManagerDelegate,CBPeripheralDelegate这两个代理
当创建了一个central manager,会回调代理的方法,你必须实现这个代理方法来确定中心设备是否支持BLE以及是否可用。
步骤二.搜索正在广告的外围设备
中心设备的第一个任务是搜索你的APP可以连接的外围设备,正如上一篇文章中提到的,广告(advertising)是外围设备使其被周围设备发现的主要方法,你可以通过类的 方法,搜索任何正在广告的外围设备:
[myCentralManager scanForPeripheralsWithServices:nil options:nil];
你调用了 方法来搜索可连接的外围设备后,central manager 在每次搜索到一个外围设备都会回调其代理的 方法。任何被搜索到的外围设备都以类的方式返回。像下面的代码,你可以实现这个代理方法来罗列出所有被搜索到的蓝牙设备:
– (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheraladvertisementData:(NSDictionary *)advertisementDataRSSI:(NSNumber *)RSSI {NSLog(@"Discovered %@", peripheral.name);…
当你已经找到了一个你需要连接的外围设备,停止搜索其它设备来节省电量。
[myCentralManager stopScan];NSLog(@"Scanning stopped”);
步骤三.连接一个你搜索到并希望连接的外围设备
在你搜索到一个外围设备,并且它广告了你需要的服务,你可以请求和这个外围设备连接,通过调用 CBCentralManager类的方法,简而言之,调用这个方法并且说明你需要连接的外围设备:
[myCentralManager connectPeripheral:peripheral options:nil];
假设连接成功了,central manager 会回调其代理方法 ,你可以实现这个方法来打印“外围设备连接”:
– (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {NSLog(@"Peripheral connected");…
在你开始和外围设备交互之前,你应该设置外围设备的代理以确保它能接收合适的回调,,像这样
peripheral.delegate = self;
步骤四.搜索你已经连接的外围设备的服务
在你与外围设备建立连接之后,你可以开始勘察它的数据。第一步是勘察外围设备提供了什么服务,因为外围设备广告的数据有大小限制,你或许会发现外围设备提供比它广告的还有更多服务。你可以通过CBPeripheral类的 方法来发现一个外围设备提供的所有服务:
[peripheral discoverServices:nil];
当发现了具体的服务,外围设备(已经连接的 CBPeripheral类)会回调其代理的 方法。Core Bluetooth 建立 类的array数组——存储外围设备的每一个服务。像下面的代码,你可以实现这个代理方法来获得发现的服务列表:
– (void)peripheral:(CBPeripheral *)peripheraldidDiscoverServices:(NSError *)error {for (CBService *service in peripheral.services) {NSLog(@"Discovered service %@", service);…}…
五.搜索服务的特征
假定你已经找到了你需要的服务,下一步就是探索服务的所有“特征”(characteristics),搜索一个服务的所有特征只要调用 CBPeripheral类的方法,参数为具体的服务:
NSLog(@"Discovering characteristics for service %@", interestingService);[peripheral discoverCharacteristics:nil forService:interestingService];
当发现了指定服务的特征,外围设备会回调代理方法。Core Bluetooth建立存储实例的array数组———每一个都代表一个发现了的特征。下面的示例就是实现这个代理方法来简单地打印每个发现了的特征:
– (void)peripheral:(CBPeripheral *)peripheraldidDiscoverCharacteristicsForService:(CBService *)serviceerror:(NSError *)error {for (CBCharacteristic *characteristic in service.characteristics) {NSLog(@"Discovered characteristic %@", characteristic);…}…
六.取得特征的值(就是从外围设备取数据)
一个特征包含一个代表外围设备服务的简单值,例如,有一个健康温度计服务,这个服务有一个温度测量特征,而这个特征有一个摄氏温度的值,你可以直接读取或者订阅这个特征来取得这个特征对应的值。
直接读取特征的值
你得到你希望得到的服务的某个特征后,你可以通过调用类的方法来读取这个特征对应的值,参数为需要读取的特征:
NSLog(@"Reading value for characteristic %@", interestingCharacteristic); [peripheral readValueForCharacteristic:interestingCharacteristic];
当你试图去读一个特征对应的值,外围设备会回调它的代理方法
去取值,如果值成功返回,你可以通过特征的value属性来获得它:
生命太过短暂,今天放弃了明天不一定能得到