iOS蓝牙调用的一般流程-CBPeripheralManagert和CBCentralManager

iOS蓝牙调用的一般流程

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

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

2.需要的主要类有:

@property(strong,nonatomicCBPeripheralManager *peripheraManager;

@property(strong,nonatomic) CBMutableCharacteristic *customerCharacteristic;

 @property (strong,nonatomic) CBMutableService *customerService;

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//
//  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

 

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

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

2.主要用到的类有 

@property(strong,nonatomic)CBCentralManager *centralManager;

@property(strong,nonatomic)NSMutableData *mutableData;

@property(strong,nonatomic)CBPeripheral *peripheral;

 3.一般的流程

复制代码
  1 //
  2 //  ViewController.m
  3 //  BlueToothClient
  4 //
  5 //  Created by PSH_Chen_Tao on 7/3/13.
  6 //  Copyright (c) 2013 wolfman. All rights reserved.
  7 //
  8 
  9 #import "ViewController.h"
 10 static NSString *const kCharacteristicUUID = @"CCE62C0F-1098-4CD0-ADFA-C8FC7EA2EE90";
 11 
 12 static NSString *const kServiceUUID = @"50BD367B-6B17-4E81-B6E9-F62016F26E7B";
 13 @interface ViewController ()
 14 
 15 @end
 16 
 17 @implementation ViewController
 18 
 19 @synthesize centralManager;
 20 @synthesize mutableData;
 21 @synthesize peripheral;
 22 
 23 - (void)viewDidLoad
 24 {
 25     [super viewDidLoad];
 26     // Do any additional setup after loading the view, typically from a nib.
 27     //初始化后会调用代理CBCentralManagerDelegate 的 - (void)centralManagerDidUpdateState:(CBCentralManager *)central
 28     centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
 29    
 30 }
 31 
 32 - (void)didReceiveMemoryWarning
 33 {
 34     [super didReceiveMemoryWarning];
 35     // Dispose of any resources that can be recreated.
 36 }
 37 
 38 #pragma  mark -- CBCentralManagerDelegate
 39 - (void)centralManagerDidUpdateState:(CBCentralManager *)central{
 40     switch (central.state) {
 41             //判断状态开始扫瞄周围设备 第一个参数为空则会扫瞄所有的可连接设备  你可以
 42             //指定一个CBUUID对象 从而只扫瞄注册用指定服务的设备
 43             //scanForPeripheralsWithServices方法调用完后会调用代理CBCentralManagerDelegate的
 44             //- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI方法
 45         case CBCentralManagerStatePoweredOn:
 46             [centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] options:@{CBCentralManagerScanOptionAllowDuplicatesKey : YES}];
 47             
 48             
 49             break;
 50             
 51         default:
 52             break;
 53     }
 54 }
 55 
 56 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
 57     if (peripheral) {
 58         self.peripheral = peripheral;
 59         //发现设备后即可连接该设备 调用完该方法后会调用代理CBCentralManagerDelegate的- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral表示连接上了设别
 60         //如果不能连接会调用 - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
 61         [centralManager connectPeripheral:peripheral options:@{CBConnectPeripheralOptionNotifyOnConnectionKey : YES}];
 62     }
 63 }
 64 
 65 - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
 66     NSLog(@"has connected");
 67     [mutableData setLength:0];
 68     self.peripheral.delegate = self;
 69     //此时设备已经连接上了  你要做的就是找到该设备上的指定服务 调用完该方法后会调用代理CBPeripheralDelegate(现在开始调用另一个代理的方法了)的
 70     //- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
 71     [self.peripheral discoverServices:@[[CBUUID UUIDWithString:kServiceUUID]]];
 72     
 73 }
 74 
 75 
 76 - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
 77     //此时连接发生错误
 78     NSLog(@"connected periphheral failed");
 79 }
 80 
 81 
 82 #pragma mark -- CBPeripheralDelegate
 83 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
 84     if (error==nil) {
 85         //在这个方法中我们要查找到我们需要的服务  然后调用discoverCharacteristics方法查找我们需要的特性
 86         //该discoverCharacteristics方法调用完后会调用代理CBPeripheralDelegate的
 87         //- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
 88         for (CBService *service in peripheral.services) {
 89             if ([service.UUID isEqual:[CBUUID UUIDWithString:kServiceUUID]]) {
 90                 [peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:kCharacteristicUUID]] forService:service];
 91             }
 92         }
 93     }
 94 }
 95 
 96 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
 97     if (error==nil) {
 98         //在这个方法中我们要找到我们所需的服务的特性 然后调用setNotifyValue方法告知我们要监测这个服务特性的状态变化
 99         //当setNotifyValue方法调用后调用代理CBPeripheralDelegate的- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
100         for (CBCharacteristic *characteristic in service.characteristics) {
101             if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:kCharacteristicUUID]]) {
102                 
103                 [peripheral setNotifyValue:YES forCharacteristic:characteristic];
104             }
105         }
106     }
107 }
108 
109 - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
110     if (error==nil) {
111         //调用下面的方法后 会调用到代理的- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
112         [peripheral readValueForCharacteristic:characteristic];
113     }
114 }
115 
116 
117 - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
118     
119 }
120 
121 @end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值