IOS BLE蓝牙4.0

前言:

      自己做的项目里面有这么一个功能,总结归纳一下。

先导入必要的框架  CoreBluetooth.framework

在要用到蓝牙的文件里面导入以下头文件

#import <CoreBluetooth/CoreBluetooth.h>
#import<CoreBluetooth/CBService.h>

接着需要实现两个协议,CBCentralManagerDelegate ,CBPeripheralDelegate

1.先实例化

CBCentralManager    

[self cMgr];
- (CBCentralManager *)cMgr
{
    if (!_cMgr) {
        _cMgr = [[CBCentralManager alloc] initWithDelegate:self
                                                     queue:dispatch_get_main_queue() options:nil];
    }
    return _cMgr;
}

判断一下设备的蓝牙是否打开

 if (self.cMgr.state == CBCentralManagerStatePoweredOn) {}

开始扫描蓝牙设备

[self.cMgr scanForPeripheralsWithServices:nil // 通过某些服务筛选外设
                                          options:nil]; // dict,条件

-   (void)centralManagerDidUpdateState:(CBCentralManager *)central

这个方法主要是来检查IOS设备的蓝牙硬件的状态的,比如说你的设备不支持蓝牙4.0,

 

如果周围有正在广播的外设,且被扫描到了的话会触发

- (void)centralManager:(CBCentralManager *)central // 中心管理者

 didDiscoverPeripheral:(CBPeripheral *)peripheral // 外设

     advertisementData:(NSDictionary *)advertisementData // 外设携带的数据

                  RSSI:(NSNumber *)RSSI

 

在这个方法里面,可以对扫描到的设备进行筛选出自己想要的目标外设,进行连接

[self.cMgr connectPeripheral:self.peripheral options:nil];

 

连接成功/失败/丢失连接的话会触发相应的

- (void)centralManager:(CBCentralManager *)central // 中心管理者

  didConnectPeripheral:(CBPeripheral *)peripheral

- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error

连接已经成功,我们就该考虑是不是要停止中心管理设备的扫描动作了,要不然在你和已经连接好的外设进行数据沟通时,如果又有一个外设进行广播且符合你的连接条件,那么你的IOS设备就会也去连接这个设备(因为IOS BLE4.0是支持一对多连接的),导致数据的混乱。所以我们在这个方法里面停止扫描动作:

[self.cMgr stopScan];

接下来是让我们的第二个实例对像出场了  CBPeripheral

连接成功后 调

[self.peripheral discoverServices:nil];

可以进一步了解到Serverce里面的Characteristic

之后会回调

// 发现外设服务里的特征的时候调用的代理方法
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error

接着我们可以在这个方法里面继续了解到某个CBService 里面的特征值UUID:

就会回调下面的方法:

-   (void)peripheral:(CBPeripheral *)peripheraldidDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error

接下来就是一些对某个特征值的读写操作了,当然我们首先要找到我们需要写数据的特征值UUID了,这里我们可以简单地通过循环来找出外设含有的某个特征值UUID:

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    if (error) {
        NSLog(@"%s, line = %d, error = %@", __FUNCTION__, __LINE__, error.localizedDescription);
        NSLog(@"%@",error.localizedDescription);
        return;
    }
    for (CBCharacteristic *cha in service.characteristics) {
        if ([[cha UUID] isEqual:[CBUUID UUIDWithString:@"FFE4"]])
        {
            [peripheral setNotifyValue:YES forCharacteristic:cha];
        }
        else if ([[cha UUID] isEqual:[CBUUID UUIDWithString:@"FFE9"]])
        {
            
            
            self.sendCharacteristic = cha;
            [self dealWithCmd];
        }
        
        
    }
}

// 更新特征的value的时候会调用

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

// 更新特征的value的时候会调用
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
    //接收到数据的话,解析数据,根据sign判断
    if ([[characteristic UUID] isEqual:[CBUUID UUIDWithString:@"FFE4"]]) {
        NSLog(@"更新特征%@",characteristic.value);
        }
}
// 更新特征的描述的值的时候会调用
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForDescriptor:(CBDescriptor *)descriptor error:(NSError *)error
{
    NSLog(@"%s, line = %d", __FUNCTION__, __LINE__);
    
    [peripheral readValueForDescriptor:descriptor];
}

// 发现外设的特征的描述数组
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error
{
    NSLog(@"%s, line = %d", __FUNCTION__, __LINE__);
    
    // 在此处读取描述即可
    for (CBDescriptor *descriptor in characteristic.descriptors) {
        // 它会触发
        [peripheral readValueForDescriptor:descriptor];
    }
}

 

posted @ 2016-06-29 14:53  Mr.H_box  阅读(802)  评论(0编辑  收藏  举报