• iOS开发蓝牙 蓝牙4.0的各种踩过的坑,希望你们少踩点


    1.首先建立这个三个参数

    @property (nonatomic,strong)CBCentralManager * manager;
    @property (nonatomic,strong)CBPeripheral     * peripheral;
    @property (nonatomic,strong)CBCharacteristic *writeDataCharacteristic

    2、初始化CBCentralManager

    -(CBCentralManager *)manager
    {
        if (!_manager )
        {
            _manager  = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) options:nil];
    
        }
        return _manager;
    }

    3.开始扫描蓝牙

       [self.manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerRestoredStateScanOptionsKey:@(YES)}];

    4.当蓝牙状态改变的时候就会调用这个方法

    - (void)centralManagerDidUpdateState:(CBCentralManager *)central
    {
        switch (central.state) {
            case CBCentralManagerStateUnknown:
                 //设备不支持的状态
                NSLog(@">>>CBCentralManagerStateUnknown");
    
                {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        ALERTVIEW(@"设备不支持");
    
                    });
    
                }
                break;
            case CBCentralManagerStateResetting:
                //正在重置状态
            {
                dispatch_async(dispatch_get_main_queue(), ^{
                    ALERTVIEW(@"正在重置状态");
    
                })  ;
            }
                NSLog(@">>>CBCentralManagerStateResetting");
                break;
            case CBCentralManagerStateUnsupported:
                 //设备不支持的状态
            {
                dispatch_async(dispatch_get_main_queue(), ^{
                    ALERTVIEW(@"设备不支持的状态");
    
                });
    
            }
                NSLog(@">>>CBCentralManagerStateUnsupported");
                break;
            case CBCentralManagerStateUnauthorized:
    
                // 设备未授权状态
            {
                dispatch_async(dispatch_get_main_queue(), ^{
                    ALERTVIEW(@"设备未授权状态");
    
                });
    
            }
                NSLog(@">>>CBCentralManagerStateUnauthorized");
                break;
            case CBCentralManagerStatePoweredOff:
                 //设备关闭状态
            {
                dispatch_async(dispatch_get_main_queue(), ^{
                    ALERTVIEW(@"设备关闭状态");
    
                });
    
            }
                NSLog(@">>>CBCentralManagerStatePoweredOff");
                break;
            case CBCentralManagerStatePoweredOn:
                NSLog(@">>>CBCentralManagerStatePoweredOn");
                //开始扫描周围的外设
    
                [self.manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerRestoredStateScanOptionsKey:@(YES)}];
    
                break;
            default:
                break;
        }
    
    
    }
    

    5.连接外围设备

    - (void)connect:(CBPeripheral *)peripheral
    {
        // 连接外围设备
        [self.manager connectPeripheral:peripheral options:nil];
    }

    6.连接玩设备就调用成功的方法,然后开始扫描

    //连接到Peripherals-成功 //扫描外设中的服务和特征  连接上外围设备的时候会调用该方法
    - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
    {
        NSLog(@">>>连接到名称为(%@)的设备-成功",peripheral.name);
        //设置的peripheral委托CBPeripheralDelegate
        //@interface ViewController : UIViewController
        [peripheral setDelegate:self];
        //扫描外设Services,成功后会进入方法:-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
        [peripheral discoverServices:nil];
    
    }
    //连接到Peripherals-失败
    -(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
    {
        NSLog(@">>>连接到名称为(%@)的设备-失败,原因:%@",[peripheral name],[error localizedDescription]);
    }

    7.发现服务和设备的服务设备services

    //发现服务
    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
    
        NSLog(@"Discovered services for %@ ", peripheral.name);
        if (![self.dataSourceArray containsObject:peripheral])
        {
            [self.dataSourceArray addObject:peripheral];
            NSLog(@"%@",peripheral);
            dispatch_async(dispatch_get_main_queue(), ^{
                [_tableView reloadData];
            });
    
        }
    
    }
    
    
    /**
     *  发现外围设备的服务会来到该方法(扫描到服务之后直接添加peripheral的services)
     */
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
    {
    
        NSLog(@"发现外围设备的服务");
        for (CBService *serivce in peripheral.services) {
            NSLog(@"====%@------%@+++++++",serivce.UUID.UUIDString,self.peripheral.identifier);
            if ([serivce.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_PROPRIETARY_SERVICE]) {
                // characteristicUUIDs : 可以指定想要扫描的特征(传nil,扫描所有的特征)
                [peripheral discoverCharacteristics:nil forService:serivce];
            }
        }
    }

    8.找到了设备的服务然后扫描特征

    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
    {
        NSLog(@"发现外围设备的特征");
    
        for (CBCharacteristic *characteristic in service.characteristics) {
            NSLog(@"====%@------+",characteristic.UUID.UUIDString);
    
            if ([characteristic.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_TRANS_TX]) {
                // 拿到特征,和外围设备进行交互
    
                [self notifyCharacteristic:peripheral characteristic:characteristic];
            }
        }
        for (CBCharacteristic *characteristic in service.characteristics) {
            NSLog(@"====%@------+",characteristic.UUID.UUIDString);
    
            if ([characteristic.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_TRANS_RX]) {
                // 拿到特征,和外围设备进行交互   保存写的特征
                self.writeDataCharacteristic = characteristic;
    
    
    
    
            }
        }
    }

    9.最后一步要写上通知这个一定要写上

    //设置通知
    -(void)notifyCharacteristic:(CBPeripheral *)peripheral
                 characteristic:(CBCharacteristic *)characteristic{
        //设置通知,数据通知会进入:didUpdateValueForCharacteristic方法
        [peripheral setNotifyValue:YES forCharacteristic:characteristic];
        [self.manager stopScan];
    
    }
    
    //取消通知
    -(void)cancelNotifyCharacteristic:(CBPeripheral *)peripheral
                       characteristic:(CBCharacteristic *)characteristic{
    
        [peripheral setNotifyValue:NO forCharacteristic:characteristic];
    }
    

    10.大功告成只差一步就是写数据

    //写数据
    -(void)writeCharacteristic:(CBPeripheral *)peripheral
                characteristic:(CBCharacteristic *)characteristic
                         value:(NSData *)value
    {
        //只有 characteristic.properties 有write的权限才可以写
        if(characteristic.properties & CBCharacteristicPropertyWrite){
            /*
             最好一个type参数可以为CBCharacteristicWriteWithResponse或type:CBCharacteristicWriteWithResponse,区别是是否会有反馈
             */
            [peripheral writeValue:value forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
        }else{
            NSLog(@"该字段不可写!");
        }
    }

    11.希望能帮到人,让别人少走点坑。

  • 相关阅读:
    LeetCode 368Largest Divisible Subset
    macbook 源码安装 redis6.2.6
    macbook 源码安装 nginx1.20.1
    MySQL总结
    DataWork之 MaxComputer的使用
    Spring的IOC源码分析
    Spring Bean的生命周期
    SpringMVC工作原理
    Spring全家桶(二)之SpringMVC总结
    (已经成功部署)配置vue+nginx+uwsgi luffy项目
  • 原文地址:https://www.cnblogs.com/yuejunjie/p/5282321.html
Copyright © 2020-2023  润新知