美文网首页蓝牙iOS Developer程序员
IOS蓝牙4.0(BLE)开发(二)

IOS蓝牙4.0(BLE)开发(二)

作者: 在海边的人 | 来源:发表于2016-09-10 14:37 被阅读956次

          其实IOS的BLE开发并不是特别复杂,难度也不是很大。它的实质就是CoreBluetooth.framework这一个框架的使用,即使你以前对蓝牙毫无了解,如果你花时仔细研究一下API,也是很容易上手的。我这里就是想把当时自己摸索的过程尽可能详细的整理出来,这样可以让刚开始接触蓝牙开发的小伙伴们,更加快速的了解这方面的东西,进行开发工作。

    CoreBluetooth框架中心模式介绍:

    1.准备工作:

    我们新建一个BLE工程之后首先要做的事情就是导入CoreBluetooth库,我们在TARGETS——>Build Phases-->Link Binary With Libraries中搜索添加,如下图所示:

    接下来就是在需要使用CB的时候引入头文件,并且声明代理:

           我么可以看到我们定义了一些宏,这就是具体你需要连接的外设中的服务与特征的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代理方法,此方法由系统调用:

    扫描外设:

    [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);//打印错误信息 }

    }

    自己写一个方法来查看所有的特征值:

    我们还可以通过这一个方法监听到通知的状态:

    - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {

    if (!error) {

    NSLog(@"注册成功!");

    }else {

    NSLog(@"注册失败!:%@",error);

    } }

           为了避免篇幅太长,这篇文章就先介绍到这里。获取到服务与特征之后,就可以开始和设备进行数据的交互了。而整个蓝牙开发过程最复杂的地方,也是最重要的地方就是,数据的交互了。其实这篇文章介绍的内容有很多博客也都介绍的很多了,我这里为了尽可能详细的介绍,说的比较繁琐,如果有什么错误的地方大家及时指正。一起交流,共同进步!


    相关文章

      网友评论

        本文标题:IOS蓝牙4.0(BLE)开发(二)

        本文链接:https://www.haomeiwen.com/subject/liuyettx.html