说明:苹果官方开发文档中涉及一些名词:Central(中心设备)、Peripheral(外围设备)、advertising(广告)、Services(服务)、Characteristic(特征)等,我都用括号内的中文进行翻译,并且不做详细解释,可能存在误导,请谅解。
目录:
步骤1.建立一个Central Manager实例进行蓝牙管理
步骤2.搜索外围设备
步骤3.连接外围设备
步骤4.获得外围设备的服务
步骤5.获得服务的特征
步奏6.从外围设备读数据(直接读取和订阅两种方法)
步骤7.给外围设备发送数据
步骤一.开启Central Manager
CBCentralManager 是Core Bluetooth的一个对象,代表一个本地中心设备,在使用任何蓝牙传输前,你必须给CBCentralManager实例分配内存和初始化。可以通过CBCentralManager类的initWithDelegate:queue:options: 方法:
1.
<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,会回调代理的centralManagerDidUpdateState:方法,你必须实现这个代理方法来确定中心设备是否支持BLE以及是否可用。
步骤二.搜索正在广告的外围设备
中心设备的第一个任务是搜索你的APP可以连接的外围设备,正如上一篇文章中提到的,广告(advertising)是外围设备使其被周围设备发现的主要方法,你可以通过CBCentralManager类的scanForPeripheralsWithServices:options: 方法,搜索任何正在广告的外围设备:
1.
[myCentralManager scanForPeripheralsWithServices:nil options:nil];
你调用了scanForPeripheralsWithServices:options: 方法来搜索可连接的外围设备后,central manager 在每次搜索到一个外围设备都会回调其代理的centralManager:didDiscoverPeripheral:advertisementData:RSSI: 方法。任何被搜索到的外围设备都以CBPeripheral类的方式返回。像下面的代码,你可以实现这个代理方法来罗列出所有被搜索到的蓝牙设备:
01.
- (
void
)centralManager:(CBCentralManager *)central
02.
03.
didDiscoverPeripheral:(CBPeripheral *)peripheral
04.
05.
advertisementData:(NSDictionary *)advertisementData
06.
07.
RSSI:(NSNumber *)RSSI {
08.
09.
10.
11.
NSLog(@
"Discovered %@"
, peripheral.name);
12.
13.
...
当你已经找到了一个你需要连接的外围设备,停止搜索其它设备来节省电量。
1.
[myCentralManager stopScan];
2.
NSLog(@"Scanning stopped”);
步骤三.连接一个你搜索到并希望连接的外围设备
在你搜索到一个外围设备,并且它广告了你需要的服务,你可以请求和这个外围设备连接,通过调用 CBCentralManager类的connectPeripheral:options:方法,简而言之,调用这个方法并且说明你需要连接的外围设备:
1.
[myCentralManager connectPeripheral:peripheral options:nil];
假设连接成功了,central manager 会回调其代理方法centralManager:didConnectPeripheral: ,你可以实现这个方法来打印“外围设备连接”: