• (转)iOS蓝牙调用的一般流程


    文章转自:http://www.cnblogs.com/ctaodream/archive/2013/07/03/3169962.html

    一、服务端(也叫周边设备吧。。脑残的翻译)

    1.实现类必须遵守协议 CBPeripheralManagerDelegate

    2.需要的主要类有:

    @property(strong,nonatomic) CBPeripheralManager *peripheraManager;

    @property(strong,nonatomic) CBMutableCharacteristic *customerCharacteristic;

     @property (strong,nonatomic) CBMutableService *customerService;

    3.调用流程代码中有注释

    //
    //  ViewController.m
    //  BlueToothDemo
    //
    //  Created by PSH_Chen_Tao on 7/3/13.
    //  Copyright (c) 2013 wolfman. All rights reserved.
    //
     
    #import "ViewController.h"
    static NSString *const kCharacteristicUUID = @"CCE62C0F-1098-4CD0-ADFA-C8FC7EA2EE90";
     
    static NSString *const kServiceUUID = @"50BD367B-6B17-4E81-B6E9-F62016F26E7B";
    @interface ViewController ()
     
    @end
     
    @implementation ViewController
     
     
    @synthesize peripheraManager;
    @synthesize customerCharacteristic;
    @synthesize customerService;
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        //初始化后会直接调用代理的  - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral
         
        peripheraManager = [[CBPeripheralManager alloc]initWithDelegate:self queue:nil];
      //  [peripheraManager startAdvertising:nil];
         
    }
     
    -(void)setUp{
        CBUUID *characteristicUUID = [CBUUID UUIDWithString:kCharacteristicUUID];
        customerCharacteristic = [[CBMutableCharacteristic alloc]initWithType:characteristicUUID properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable];
        CBUUID *serviceUUID = [CBUUID UUIDWithString:kServiceUUID];
        customerService = [[CBMutableService alloc]initWithType:serviceUUID primary:YES];
        [customerService setCharacteristics:@[characteristicUUID]];
        //添加后就会调用代理的- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error
        [peripheraManager addService:customerService];
         
    }
     
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
     
    #pragma  mark -- CBPeripheralManagerDelegate
    - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral{
        switch (peripheral.state) {
                //在这里判断蓝牙设别的状态  当开启了则可调用  setUp方法(自定义)
            case CBPeripheralManagerStatePoweredOn:
                NSLog(@"powered on");
                [self setUp];
                break;
                case CBPeripheralManagerStatePoweredOff:
                NSLog(@"powered off");
                break;
                 
            default:
                break;
        }
    }
     
     
     
    - (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error{
        if (error == nil) {
            //添加服务后可以在此向外界发出通告 调用完这个方法后会调用代理的
            //(void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error
            [peripheraManager startAdvertising:@{CBAdvertisementDataLocalNameKey : @"Service",CBAdvertisementDataServiceUUIDsKey : [CBUUID UUIDWithString:kServiceUUID]}];
        }
         
    }
     
    - (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error{
        NSLog(@"in peripheralManagerDidStartAdvertisiong:error");
    }
    @end
    View Code

    二、客户端(也叫中心设备吧)

    1.实现类要遵守协议<CBCentralManagerDelegate,CBPeripheralDelegate>

    2.主要用到的类有 

    @property(strong,nonatomic)CBCentralManager *centralManager;

    @property(strong,nonatomic)NSMutableData *mutableData;

    @property(strong,nonatomic)CBPeripheral *peripheral;

     3.一般的流程

    //
    //  ViewController.m
    //  BlueToothClient
    //
    //  Created by PSH_Chen_Tao on 7/3/13.
    //  Copyright (c) 2013 wolfman. All rights reserved.
    //
    
    #import "ViewController.h"
    static NSString *const kCharacteristicUUID = @"CCE62C0F-1098-4CD0-ADFA-C8FC7EA2EE90";
    
    static NSString *const kServiceUUID = @"50BD367B-6B17-4E81-B6E9-F62016F26E7B";
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    @synthesize centralManager;
    @synthesize mutableData;
    @synthesize peripheral;
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        //初始化后会调用代理CBCentralManagerDelegate 的 - (void)centralManagerDidUpdateState:(CBCentralManager *)central
        centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
       
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    #pragma  mark -- CBCentralManagerDelegate
    - (void)centralManagerDidUpdateState:(CBCentralManager *)central{
        switch (central.state) {
                //判断状态开始扫瞄周围设备 第一个参数为空则会扫瞄所有的可连接设备  你可以
                //指定一个CBUUID对象 从而只扫瞄注册用指定服务的设备
                //scanForPeripheralsWithServices方法调用完后会调用代理CBCentralManagerDelegate的
                //- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI方法
            case CBCentralManagerStatePoweredOn:
                [centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] options:@{CBCentralManagerScanOptionAllowDuplicatesKey : YES}];
                
                
                break;
                
            default:
                break;
        }
    }
    
    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
        if (peripheral) {
            self.peripheral = peripheral;
            //发现设备后即可连接该设备 调用完该方法后会调用代理CBCentralManagerDelegate的- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral表示连接上了设别
            //如果不能连接会调用 - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
            [centralManager connectPeripheral:peripheral options:@{CBConnectPeripheralOptionNotifyOnConnectionKey : YES}];
        }
    }
    
    - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
        NSLog(@"has connected");
        [mutableData setLength:0];
        self.peripheral.delegate = self;
        //此时设备已经连接上了  你要做的就是找到该设备上的指定服务 调用完该方法后会调用代理CBPeripheralDelegate(现在开始调用另一个代理的方法了)的
        //- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
        [self.peripheral discoverServices:@[[CBUUID UUIDWithString:kServiceUUID]]];
        
    }
    
    
    - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
        //此时连接发生错误
        NSLog(@"connected periphheral failed");
    }
    
    
    #pragma mark -- CBPeripheralDelegate
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
        if (error==nil) {
            //在这个方法中我们要查找到我们需要的服务  然后调用discoverCharacteristics方法查找我们需要的特性
            //该discoverCharacteristics方法调用完后会调用代理CBPeripheralDelegate的
            //- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
            for (CBService *service in peripheral.services) {
                if ([service.UUID isEqual:[CBUUID UUIDWithString:kServiceUUID]]) {
                    [peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:kCharacteristicUUID]] forService:service];
                }
            }
        }
    }
    
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
        if (error==nil) {
            //在这个方法中我们要找到我们所需的服务的特性 然后调用setNotifyValue方法告知我们要监测这个服务特性的状态变化
            //当setNotifyValue方法调用后调用代理CBPeripheralDelegate的- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
            for (CBCharacteristic *characteristic in service.characteristics) {
                if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:kCharacteristicUUID]]) {
                    
                    [peripheral setNotifyValue:YES forCharacteristic:characteristic];
                }
            }
        }
    }
    
    - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
        if (error==nil) {
            //调用下面的方法后 会调用到代理的- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
            [peripheral readValueForCharacteristic:characteristic];
        }
    }
    
    
    - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
        
    }
    
    @end
    View Code
  • 相关阅读:
    第一章--购物车作业
    第一章--三级菜单作业
    第3章 文件操作-函数练习题
    面试题2.20
    Python 技巧(三)—— list 删除一个元素的三种做法
    Python 字符串操作方法大全
    员工信息增删改查程序
    Python之print函数详解
    判断登陆用户名和密码是否正确-记事本存用户名密码
    软件开发目录规范
  • 原文地址:https://www.cnblogs.com/kw-ios/p/3923733.html
Copyright © 2020-2023  润新知