zoukankan      html  css  js  c++  java
  • 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];
        }
    }
  • 相关阅读:
    Python 集合
    Python sorted()
    CodeForces 508C Anya and Ghosts
    CodeForces 496B Secret Combination
    CodeForces 483B Friends and Presents
    CodeForces 490C Hacking Cypher
    CodeForces 483C Diverse Permutation
    CodeForces 478C Table Decorations
    CodeForces 454C Little Pony and Expected Maximum
    CodeForces 313C Ilya and Matrix
  • 原文地址:https://www.cnblogs.com/HQBBOX/p/5626840.html
Copyright © 2011-2022 走看看