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];
        }
    }
  • 相关阅读:
    关于windows客户端网络编程 WSAAsyncSelect函数
    阻塞模式和非阻塞模式
    SRP6协议分析
    普通二叉树转换成二叉查找树方法
    使用openssl库进行开发
    类型转化,网络开发中常见的类型转化
    到底还能够称多久
    权限子系统小结
    使用ASP.NET AJAX开发服务器端事件通知器
    通用权限相关文档的下载
  • 原文地址:https://www.cnblogs.com/HQBBOX/p/5626840.html
Copyright © 2011-2022 走看看