zoukankan      html  css  js  c++  java
  • 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.希望能帮到人,让别人少走点坑。

  • 相关阅读:
    use paramiko to connect remote server and execute command
    protect golang source code
    adjust jedi vim to python2 and python3
    install vim plugin local file offline
    add swap file if you only have 1G RAM
    datatables hyperlink in td
    django rest framework custom json format
    【JAVA基础】网络编程
    【JAVA基础】多线程
    【JAVA基础】String类的概述和使用
  • 原文地址:https://www.cnblogs.com/yuejunjie/p/5282321.html
Copyright © 2011-2022 走看看