iOS蓝牙4.0 CoreBluetooth框架开发

原创 2016年02月29日 10:48:37

CoreBluetooth框架的核心其实是两个东西,peripheral和central,可以理解成外设和中心。对应他们分别有一组相关的API和类。

1

周边(Peripheral)是生成或者保存了数据的设备,中央(Central)是使用这些数据的设备。所有可用的iOS设备可以作为周边(Peripheral)也可以作为中央(Central),但不可以同时即是周边也是中央。

周边和中央这两个角色在CoreBluetooth框架中是用两个类表示的,CBPeripheralManager这个类代表周边,CBCentralManager这个类代表中央。你可以认为周边是一个广播式数据的设备,他广播到外部世界说他这有数据,并且也说明了提供的服务。另一边,中央开始扫描附近有没有服务,如果中央发现了想要的服务,然后中央就会请求周边,一旦连接建立成功,一旦连接建立成功,两个设备之间就开始交换传输数据了。在中央这边,CBService类代表服务,CBCharacteristic类代表特征。在周边这边,CBMutableService类代表服务,CBMutableCharacteristic类代表特征。
每个蓝牙4.0的设备都是通过服务和特征来展示自己的,一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征。特征是与外界交互的最小单位。比如说,一台蓝牙4.0设备,用特征A来表述自己的出场信息,用特征B来与手法数据等。每一个服务和特征都需要用一个UUID去标识,UUID是一个16bit或者128bit的值。如果你要创建你得中央-周边App,你需要创建自己的128bit的UUID。你必须要确定你自己的UUID不能和其他已经存在的服务冲突。如果你正要创建一个自己的设备,需要实现标准委员会需求的UUID;如果你只是创建一个中央-周边App,我建议你打开MacOS X的terminal.app,用uuidgen命令生成一个128bit的UUID。你应该用该命令两次,生成两个UUID,一个是服务用的,一个是特征用的。然后你需要添加他们到中央和周边App中。

蓝牙设备硬件厂商通常都会提供他们的设备里面各个服务(service)和特征(characteristics)的功能,比如哪些是用来交互(读写),哪些可获取模块信息(只读)等。App和硬件之间通讯,App的角色是central,硬件角色就是peripheral,如果是App和App之间通讯,那么iOS这便是central,另一个iOS设备就是peripheral了。这里要介绍App和硬件之间的通讯,也就是介绍central。

作为一个中心要实现的完整通讯,一般要经过这样几个步骤:
建立中心角色—>扫描外设—>连接外设—>扫描外设中的服务和特征—>与外设做数据交互—>断开连接。
首先在我自己类的头文件中包含CoreBluetooth的头文件,并集成两个协议CBCentralManagerDelegate,CBPeripheralDelegate。

1.创建中心角色
将CBCentralManagerDelegate协议委托给当前类实力,这里有个@required协议方法
-(void)centralManagerDidUpdateState:(CBCentralManager*)central;
当中心角色的状态发生变化的时候会触发这个方法。这个方法中通过获取中心角色的状态对它发布命令,你只能在central的state时CBCentralManagerStatePoweredOn的时候对它发布命令,当status的值低于CBCentralManagerStatePoweredOn的时候以为着扫描停止,并且任何已连接的外设都已经断开,当status的值低于CBCentralManagerStatePoweredOff时,所有的外设对象将中心角色中作为,而且必须重新发现。
_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

2.扫描外设
创建中心以后,我们在CentralMnagerDidUpdateState:方法中获取central的status时CBCentralManagerStatePoweredOn的时候来扫描外设
[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]
options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
这里的TRANSFER_SERVICE_UUID就是硬件厂商提供的服务UUID,如果第一个参数指定为空,那么所有的外设服务将被返回。

3.连接外设
当扫描到外设以后,系统会通过以下代理方法
- (void)centralManager:(CBCentralManager )central didDiscoverPeripheral:(CBPeripheral )peripheral advertisementData:(NSDictionary )advertisementData RSSI:(NSNumber )RSSI
告诉我们设备的信息,然后我们就可以连接相应的设备,我们可以通过RSSI.integerValue来获取信号强度,在这个方法中,我们可以连接想要连接的外设,代码如下:
[self.centralManager connectPeripheral:peripheral options:nil];
如果连接失败,会触发代理方法
-(void)centralManager:(CBCentralManager )central didFailToConnectPeripheral:(CBPeripheral )peripheral error:(NSError *)error;
如果连接成功,会触发代理方法:
- (void)centralManager:(CBCentralManager )central didConnectPeripheral:(CBPeripheral )peripheral;
我们可以在这里扫描外设中的服务

4.扫描外设中的服务和特征
[peripheral discoverServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]];
如果参数为空,将返回外设中所有可用的服务。通过如下代理方法返回被扫描的服务。
- (void)peripheral:(CBPeripheral )peripheral didDiscoverServices:(NSError )error;
如果error不为空,则扫描失败,反之,扫描成功,我们可以继续扫描服务中的特征。
[peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]] forService:service];
这里的TRANSFER_CHARACTERISTIC_UUID就是硬件厂商提供的特征UUID,如果第一个参数指定为空,那么所有的该服务的特征将被返回。
通过如下代理方法返回被扫描的特征。
- (void)peripheral:(CBPeripheral )peripheral didDiscoverCharacteristicsForService:(CBService)service error:(NSError *)error;
如果error不为空,则扫描失败,反之,扫描成功,我们可以继续枚举服务中的特征,通过CBCHaracteristic的properties来读取特征的属性,数据的读分为两种,一种是直接读,另一种是通知。当属性CBCharacteristicPropertyRead是可读,CBCharacteristicPropertyNotify是可通知,当特征的属性是通知的时候,我们通过如下设置来支持通知,如果你希望特征的value发生变化的时候我们被告知,就要设置YES,反之为NO。
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
这个设置会通过以下代理方法来告知是否设置成功,如果设置成功,error为nil,反之失败。
-(void)peripheral:(CBPeripheral )peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;
设置成功以后,会通过以下代理方法告知我们characteristic的value发生变化,同样地,这个代理方法也会在你调用readValueForCharacteristic:方法的时候被触发。
-(void)peripheral:(CBPeripheral )peripheral didUpdateValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

5.与外设做数据交互
读上面已经讲到
写数据:
[_discoveredPeripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
通过CBCharacteristicWriteWithResponse属性,我们可以通过以下代码方法被告知数据是否发送成功,error为空则成功,否则失败。
-(void)peripheral:(CBPeripheral )peripheral didWriteValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

6.断开连接
[self.centralManager cancelPeripheralConnection:peripheral];
我们可以通过以下代码方法被告知是否断开成功,error为空则成功,否则失败。
- (void)centralManager:(CBCentralManager )central didDisconnectPeripheral:(CBPeripheral )peripheral error:(NSError *)error;

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS之蓝牙开发—CoreBluetooth详解一

最近开始进行蓝牙模块的开发,下载一个名叫lightBlue的app,通过它可以扫描到周围开启的外部设别,并且可以进行连接,连接外部设备成功之后,就可以看到外部设别的相关信息,包含服务和特征的所有相关的...
  • wuzesong
  • wuzesong
  • 2016年03月18日 16:25
  • 2892

iOS coreBluetooth编程中需要注意的问题

iOS 设备作为中心设备(central device)时需要注意:(1)一定要对central Manager保持强引用,也就是说central Manager需要是一个全局变量不能是局部变量,否则...
  • ohyeahhhh
  • ohyeahhhh
  • 2016年08月10日 19:01
  • 2092

自己写的IOS 蓝牙连接demo 用的是coreBluetooth

服务器端 头文件 #import #import  @interface ViewController : UIViewController @property (stro...
  • w8561469
  • w8561469
  • 2015年06月18日 14:52
  • 1653

浅谈iOS中的蓝牙技术(二) -- CoreBluetooth

在上篇文章中我们提到了 iOS 开发中,使用GameKit 框架实现相同网络的 iOS 设备之间传输数据.但是 GameKit 框架在 iOS7 之后就过时了,那么本文将介绍另一种关于蓝牙的框架 Co...
  • qq_30513483
  • qq_30513483
  • 2016年04月28日 10:09
  • 3788

iOS蓝牙4.0开发(一)与外设通讯

蓝牙协议本身经历了从1.0到4.0的升级演变, 最新的4.0以其低功耗著称,所以一般也叫BLE(Bluetoothlow energy)。 iOS 有两个框架支持蓝牙与外设连接。一个是 Extern...
  • junjun150013652
  • junjun150013652
  • 2015年05月11日 17:20
  • 1482

iOS蓝牙开发(二):iOS 蓝牙4.0中心模式 代码实现

上一篇简单介绍了蓝牙的部分基础知识,详细的东西大家可以去github上搜babyBluetooth,里面有一些学习资料iOS连接外设的流程 建立中心管理者 扫描外设 discoverPeriphera...
  • u010731949
  • u010731949
  • 2017年07月10日 18:19
  • 605

基于蓝牙4.0(btle)的简单通讯流程

初始化一个CentralManager 在iOS10以后,需要在 Info.plist 文件里面设置 NSBluetoothPeripheralUsageDescription 字段,添加访问蓝牙权...
  • hejiasu
  • hejiasu
  • 2017年06月19日 21:23
  • 2118

ios蓝牙使用demo

简单粗暴上代码 步骤解释请看另一篇 http://blog.csdn.net/swibyn/article/details/20531593 demo下载 http://download.csdn...
  • swibyn
  • swibyn
  • 2016年12月21日 15:15
  • 1443

iOS开发之蓝牙4.0技术完美实现

前言前端时间,同学在做项目过程中遇到关于蓝牙方面的问题,今天我就给大家进行详细的进行讲解下蓝牙在iOS开发中的具体实现.在介绍蓝牙前,大家要搞清楚什么是蓝牙?什么是蓝牙?随着蓝牙低功耗技术BLE(Bl...
  • BaiHuaXiu123
  • BaiHuaXiu123
  • 2016年05月01日 21:13
  • 14289

【iOS】CoreBluetooth5 作为 Central 时的数据读写(OTA 固件升级与文件传输)

【iOS】CoreBluetooth5 作为 Central 时的数据读写(OTA 固件升级与文件传输)  Saitjr  三月 23, 2016  Ios  No Comments...
  • xiong1081
  • xiong1081
  • 2016年06月30日 11:18
  • 1233
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS蓝牙4.0 CoreBluetooth框架开发
举报原因:
原因补充:

(最多只允许输入30个字)