其实IOS的BLE开发并不是特别复杂,难度也不是很大。它的实质就是CoreBluetooth.framework这一个框架的使用,即使你以前对蓝牙毫无了解,如果你花时仔细研究一下API,也是很容易上手的。我这里就是想把当时自己摸索的过程尽可能详细的整理出来,这样可以让刚开始接触蓝牙开发的小伙伴们,更加快速的了解这方面的东西,进行开发工作。
CoreBluetooth框架中心模式介绍:
1.准备工作:
我们新建一个BLE工程之后首先要做的事情就是导入CoreBluetooth库,我们在TARGETS——>Build Phases-->Link Binary With Libraries中搜索添加,如下图所示:
![](https://img.haomeiwen.com/i2641301/1930a46341d050fc.png)
接下来就是在需要使用CB的时候引入头文件,并且声明代理:
![](https://img.haomeiwen.com/i2641301/4b5badd90087f2c3.png)
我么可以看到我们定义了一些宏,这就是具体你需要连接的外设中的服务与特征的UUID了,你的硬件工程师会给你相应的说明文档的。同事我们还声明了一些属性,方便我们接下来的使用,下边做一个解释:
CBCentralManager *centralManager:中心设备管理员对象。
CBPeripheral *peripheral:外设对象。
CBCharacteristic *Characteristic1;
CBCharacteristic *Characteristic2;
以上两个是其中一个服务的两个特征值,我们就是通过这些特征值和设备做交互的,1是读取设备发送给我的数据的,2是向设备写入数据发送数据的。
CBCharacteristic *characteristicTx;
CBCharacteristic *characteristicRx;这是另外一个服务中的两个特征值,作用同上。
2.创建中心设备管理员对象扫描外设
创建对象:
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
创建完对象之后,需要判断其工作状态,如果正常开启,就开始扫描外设。这是require代理方法,此方法由系统调用:
![](https://img.haomeiwen.com/i2641301/35293c953b8e2748.png)
扫描外设:
[self.centralManager scanForPeripheralsWithServices:nil options:options]; (第一个参数为空的话,默认扫描所有外服务,也可以给个参数设置过滤条件)我们在上边已经调用过了
[self.centralManager stopScan];//停止扫描
一般情况下我们会将扫描到的设备添加到一个数组里边,然后建一个TableView来显示我们搜索到的设备对象。
系统有一个搜索到设备之后自动调用的代理方法,(一般带did的都是自动调用的)在这个方法中我们可以得到搜索到外设信息,每搜索到一个设备就会调用一次该方法:
- (void)centralManager:(CBCentralManager )central didDiscoverPeripheral:(CBPeripheral )peripheral advertisementData:(NSDictionary )advertisementData RSSI:(NSNumber )RSSI
{ [_peripheralArray addObject:peripheral];//RSSI这个参数可以获取到与设备的距离; }
3.连接外设
当我们做完第二步,获取到了外设信息之后,当然是要开始连接设备了,如果我们使用了TableView,我们可以在cell的点击方法里里调用下边的方法:
- (void)connectPeripheral:(CBPeripheral )peripheral {
[self.centralManager connectPeripheral:peripheral options:nil];// 连接外设 传入你搜索到的目标外设对象
self.peripheral = peripheral;
peripheral.delegate = self;//设置外设的代理 }
相对应的也有一个断开连接的方法:
- (void)disConnectPeripheral:(CBPeripheral )peripheral{
[_centralManager cancelPeripheralConnection:peripheral];//断开连接
}
如果连接成功则自动调用成功的方法:
- (void)centralManager:(CBCentralManager )central didConnectPeripheral:(CBPeripheral )peripheral
{ NSLog(@"didConnectPeripheral:%@",peripheral.name);
[self stopScanBluetooth]; //连接成功后停止扫描
[self.peripheral setDelegate:self];//设置代理
[self discoverService];//连接成功调用此方法来发现服务 }
如果连接失败则自动调用:
- (void)centralManager:(CBCentralManager )central didFailToConnectPeripheral:(CBPeripheral )peripheral error:(NSError *)error {
NSLog(@"didFailToConnectPeripheral:%@",error);//这里可以打印出失败的信息。
}
4.发现服务与特征
成功的连接到外设之后,当然是要看看它的内部有什么服务和特征了,这样我们才能顺利的与之进行数据的交互。
发现服务: 我们连接成功的时候已经调用了这个方法来发现服务
- (void)discoverService {
[_peripheral discoverServices:@[[CBUUID UUIDWithString:OTA_SERVICE_UUID]]];}
我们可以看到这个这个方法的参数是传入一个数组,因为一个外设中可能有很多个服务,但是对于我们有使用价值的可能就呢么一个或者两个,我们可以传入相应的UUID来过滤,比如我现在只传入了一个UUID那么我发现的服务就只有这一个了,如果为nil则发现所有服务。 如果成功的发现了其中的服务系统自动回调:
- (void)peripheral:(CBPeripheral )peripheral didDiscoverServices:(NSError )error {
if (error)
{ NSLog(@"didDiscoverServices error:%@",[error localizedDescription]); return; //如果连接失败就打印出失败信息 }
else { //连接成功就遍历这些服务 来发现每个服务中的特征
for (CBService *service in peripheral.services)
{ NSLog(@"Service found with UUID: %@", service.UUID);
[peripheral discoverCharacteristics:nil forService:service];//调用此方法来发现该服务中的特征值
} } }
发现特征:发现服务之后就该扫描到该服务中的特征了,发现特征值之后系统自动回调下边的方法 ,每发现一个服务都会调用一次该方法:
- (void)peripheral:(CBPeripheral )peripheral didDiscoverCharacteristicsForService:(CBService )service error:(NSError )error
{ if (!error)
{ [self didFindAllCharacteristic:service.characteristics forService:service];//如果成功,我们可以自己写一个方法,查看特征信息等操作。 }
else { NSLog(@"%@",error);//打印错误信息 }
}
自己写一个方法来查看所有的特征值:
![](https://img.haomeiwen.com/i2641301/7440231e9faeb39f.png)
我们还可以通过这一个方法监听到通知的状态:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
if (!error) {
NSLog(@"注册成功!");
}else {
NSLog(@"注册失败!:%@",error);
} }
为了避免篇幅太长,这篇文章就先介绍到这里。获取到服务与特征之后,就可以开始和设备进行数据的交互了。而整个蓝牙开发过程最复杂的地方,也是最重要的地方就是,数据的交互了。其实这篇文章介绍的内容有很多博客也都介绍的很多了,我这里为了尽可能详细的介绍,说的比较繁琐,如果有什么错误的地方大家及时指正。一起交流,共同进步!
网友评论