首页 > 代码库 > (转)iOS蓝牙调用的一般流程

(转)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