iOS开发技巧2017

iOS蓝牙开发:解析BabyBluetooth

2016-12-20  本文已影响1394人  小堆同学

baby库:https://github.com/coolnameismy/BabyBluetooth很感谢刘彦玮为iOS蓝牙开发作出的贡献。

蓝牙开发步骤

  1. 扫描外设
  2. 发现外设
  3. 连接外设
  4. 获取外设读写的特征
  5. 获取外设发出的信息和向外设发信息

原生<CoreBluetooth/CoreBluetooth.h>就不分析了,baby是基于原生封装的,非常好用,但还是有点问题。

大家在下载babyexample的时候会发现代码有很多,有些是我们不需要用的,如何做到缩减,以及一些存在的问题如何解决。

缩减baby

  1. 扫描
baby.scanForPeripherals().begin().stop(4);

这里扫描4秒后停止扫描,这里有个问题就是扫描的时候默认是断开全部连接的,如果不需要的需要点stop改一下。

  1. 发现外设
    扫描之后会进入发现外设的代理
  [baby setBlockOnDiscoverToPeripherals:^(CBCentralManager *central, CBPeripheral *peripheral, NSDictionary *advertisementData, NSNumber *RSSI) {
        [weakSelf insertTableView:peripheral advertisementData:advertisementData];
    }];

参数解析:1. peripheral为扫描发现的外设。 2. advertisementData为外设广播包携带数据,主要获取有几个服务显示出来,只要用这个key:kCBAdvDataServiceUUIDs。3. RSSI为外设信号

  1. 连接外设
baby.having(currPeripheral).enjoy();
  1. 发现外设特征
    连接外设的成功之后会进入代理
[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]];是如果发现读的特征直接设置它具有读数据的功能

  1. 获取读和写特征之后就是写数据和收数据了
  2. 接收数据:在这里就可以对接收到的数据进行操作了
[_baby setBlockOnReadValueForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristic, NSError *error) {
}];
  1. 写数据:四个参数,外设、数据nsdata类型、写的特征、type
[self.leftPeripheral writeValue:[self hexToBytes:@"a55a03010003"] forCharacteristic:self.leftWrite type:1];

以上呢就可以做出蓝牙收发数据的功能了,还有一些代理没有写上,比如断开连接代理、连接失败代理等等,大家根据需求加上去。

注意点

  1. 点击蓝牙连接的时候,这是如果立马跳转下个页面去收发数据,会崩溃,这是因为在连接蓝牙的时候读取特征没完成就跳转了。建议:在点击链接蓝牙的时候做一个菊花,等到全部读完的时候再消失
 //设置beats break委托
    [rhythm setBlockOnBeatsBreak:^(BabyRhythm *bry) {
        NSLog(@"setBlockOnBeatsBreak call");

        //如果完成任务,即可停止beat,返回bry可以省去使用weak rhythm的麻烦
        //        if (<#condition#>) {
        //            [bry beatsOver];
        [WKHUD dismissWithHUD:self.hud];
        
    }];

在这里消失

  1. 第一次连接断开之后再连接的时候接收数据的代理直接触发,这个时候数据处理就会出错,因为处理数据的时候大部分会用到数组,这种情况数组越界崩溃。
    解决:在离开收发数据那个页面的时候
[_baby setBlockOnReadValueForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristic, NSError *error) {}];

写上这句,blobk里面什么都不要写。

最后babydemo里代理都加上了Channel,这里个人建议不要加,加了之后后续要连接多个蓝牙就很难处理的

总结
一开始做蓝牙的时候原生API真是让人很难受,自从遇到baby库真的很轻松,再次感谢刘彦伟。本人看到baby的封装之后,特意仿造封装出gameKit:http://www.jianshu.com/p/209e07344e5a

baby库提炼 : https://github.com/scrumsnail/LZBLEManager.git

上一篇下一篇

猜你喜欢

热点阅读