iOS蓝牙开发:解析BabyBluetooth
baby库:https://github.com/coolnameismy/BabyBluetooth很感谢刘彦玮为iOS蓝牙开发作出的贡献。
蓝牙开发步骤
- 扫描外设
- 发现外设
- 连接外设
- 获取外设读写的特征
- 获取外设发出的信息和向外设发信息
原生<CoreBluetooth/CoreBluetooth.h>就不分析了,baby是基于原生封装的,非常好用,但还是有点问题。
大家在下载babyexample的时候会发现代码有很多,有些是我们不需要用的,如何做到缩减,以及一些存在的问题如何解决。
缩减baby
- 扫描
baby.scanForPeripherals().begin().stop(4);
这里扫描4秒后停止扫描,这里有个问题就是扫描的时候默认是断开全部连接的,如果不需要的需要点stop改一下。
- 发现外设
扫描之后会进入发现外设的代理
[baby setBlockOnDiscoverToPeripherals:^(CBCentralManager *central, CBPeripheral *peripheral, NSDictionary *advertisementData, NSNumber *RSSI) {
[weakSelf insertTableView:peripheral advertisementData:advertisementData];
}];
参数解析:1. peripheral为扫描发现的外设。 2. advertisementData为外设广播包携带数据,主要获取有几个服务显示出来,只要用这个key:kCBAdvDataServiceUUIDs。3. RSSI为外设信号
- 连接外设
baby.having(currPeripheral).enjoy();
- 发现外设特征
连接外设的成功之后会进入代理
[baby setBlockOnDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
[rhythm beats];
if ([[service.UUID UUIDString] isEqualToString:@"FFE0"]) {
[peripheral setNotifyValue:YES forCharacteristic:service.characteristics[0]];
}
}];
这里根据UUID之后获取相对应的特征,主要是读和写特征,这里的 [peripheral setNotifyValue:YES forCharacteristic:service.characteristics[0]];是如果发现读的特征直接设置它具有读数据的功能
- 获取读和写特征之后就是写数据和收数据了
- 接收数据:在这里就可以对接收到的数据进行操作了
[_baby setBlockOnReadValueForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristic, NSError *error) {
}];
- 写数据:四个参数,外设、数据nsdata类型、写的特征、type
[self.leftPeripheral writeValue:[self hexToBytes:@"a55a03010003"] forCharacteristic:self.leftWrite type:1];
以上呢就可以做出蓝牙收发数据的功能了,还有一些代理没有写上,比如断开连接代理、连接失败代理等等,大家根据需求加上去。
注意点
- 点击蓝牙连接的时候,这是如果立马跳转下个页面去收发数据,会崩溃,这是因为在连接蓝牙的时候读取特征没完成就跳转了。建议:在点击链接蓝牙的时候做一个菊花,等到全部读完的时候再消失
//设置beats break委托
[rhythm setBlockOnBeatsBreak:^(BabyRhythm *bry) {
NSLog(@"setBlockOnBeatsBreak call");
//如果完成任务,即可停止beat,返回bry可以省去使用weak rhythm的麻烦
// if (<#condition#>) {
// [bry beatsOver];
[WKHUD dismissWithHUD:self.hud];
}];
在这里消失
- 第一次连接断开之后再连接的时候接收数据的代理直接触发,这个时候数据处理就会出错,因为处理数据的时候大部分会用到数组,这种情况数组越界崩溃。
解决:在离开收发数据那个页面的时候
[_baby setBlockOnReadValueForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristic, NSError *error) {}];
写上这句,blobk里面什么都不要写。
最后babydemo里代理都加上了Channel,这里个人建议不要加,加了之后后续要连接多个蓝牙就很难处理的
总结
一开始做蓝牙的时候原生API真是让人很难受,自从遇到baby库真的很轻松,再次感谢刘彦伟。本人看到baby的封装之后,特意仿造封装出gameKit:http://www.jianshu.com/p/209e07344e5a