注意: 此框架只能用于ios设置间蓝牙通讯
不仅限于在苹果设备间的蓝牙通讯,需要导入框架:#import <CoreBluetooth/CoreBluetooth.h>
首先,利用GameKit框架实现ios设备蓝牙通讯
基本属性和方法:
属性:
- 是否可见:visible
- 蓝牙连接类型:connectionTypesMask
方法:
- 显示蓝牙控制器:- (void)show;
- 隐藏蓝牙控制器:- (void)dismiss;
- 蓝牙连接成功会调用:- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session
- 取消蓝牙连接:- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker
- 接收到数据会调用:- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context
- 发送数据给特定的对端蓝牙设备:self.session sendData:<#(NSData *)#> toPeers:<#(NSArray *)#> withDataMode:<#(GKSendDataMode)#> error:<#(NSError *__autoreleasing *)#>
- 发送数据给所有蓝牙设备:self.session sendDataToAllPeers:<#(NSData *)#> withDataMode:<#(GKSendDataMode)#> error:<#(NSError *__autoreleasing *)#>
实现:
1 #import "WYSViewController.h"
2 #import <GameKit/GameKit.h>
3
4 @interface WYSViewController () <GKPeerPickerControllerDelegate>
5
6 // 会话
7 @property (nonatomic,strong) GKSession *session;
8
9 @end
10
11 @implementation WYSViewController
12
13 - (void)viewDidLoad
14 {
15 [super viewDidLoad];
16
17 }
18
19 - (void)didReceiveMemoryWarning
20 {
21 [super didReceiveMemoryWarning];
22 // Dispose of any resources that can be recreated.
23 }
24
25 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
26 {
27
28 // 创建蓝牙控制器
29 GKPeerPickerController *peerPk = [[GKPeerPickerController alloc] init];
30
31 // 代理
32 peerPk.delegate = self;
33
34 // 显示蓝牙控制器
35 [peerPk show];
36 }
37
38 #pragma mark - 蓝牙代理方法
39 // 蓝牙连接成功会调用
40 - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session
41 {
42 // 保存回话
43 self.session = session;
44
45 // 设置接收者
46 [self.session setDataReceiveHandler:self withContext:nil];
47
48
49 // 关闭控制器
50 [picker dismiss];
51 }
52
53 // 取消连接调用
54 - (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker
55 {
56
57 }
58
59 // 接收到数据会调用
60 - (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context
61 {
62 NSLog(@"%@",data);
63 }
64
65
66 - (IBAction)sendData
67 {
68 // 发送数据去某些蓝牙设备
69 // NSData * :要发送的数据
70 // NSArray * : 蓝牙设备
71 // GKSendDataMode:枚举模式
72 // self.session sendData:<#(NSData *)#> toPeers:<#(NSArray *)#> withDataMode:<#(GKSendDataMode)#> error:<#(NSError *__autoreleasing *)#>
73
74 // 发送数据去所有蓝牙设备
75 // self.session sendDataToAllPeers:<#(NSData *)#> withDataMode:<#(GKSendDataMode)#> error:<#(NSError *__autoreleasing *)#>
76 }
利用CoreBluetooth实现蓝牙通讯:
创建中心设备-->扫描外设-->连接外设-->扫描外设的服务和特征-->利用特征和外设进行数据交互-->断开连接
基本方法和属性:
属性:
- 中心管理设备类:CBCentralManager
- 中心管理设备代理:id<CBCentralManagerDelegate> delegate
- 中心管理设备状态:CBCentralManagerState state
- 外设类:CBPeripheral
- 服务类:CBService
- 特征类:CBCharacteristic
方法:
- 扫描外设:- (void)scanForPeripheralsWithServices:(NSArray *)serviceUUIDs options:(NSDictionary *)options;
- 停止扫描:- (void)stopScan;
- 连接外设:- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
- 外设连接成功调用:- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
- 外设连接失败调用:- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
- 扫描到服务就会调用:- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
- 扫描到特征就会调用:- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
具体实现:
1 #import "WYSViewController.h"
2 #import <CoreBluetooth/CoreBluetooth.h>
3
4 @interface WYSViewController () <CBCentralManagerDelegate,CBPeripheralDelegate>
5
6 // 中心设备
7 @property (nonatomic,strong) CBCentralManager *cbMgr;
8
9 // 全部的外部设备
10 @property (nonatomic,strong) NSMutableArray *Peripherals;
11
12 @end
13
14 @implementation WYSViewController
15
16 // 懒加载
17 - (NSMutableArray *)Peripherals
18 {
19 if (!_Peripherals){
20
21 _Peripherals = [NSMutableArray array];
22 }
23
24 return _Peripherals;
25 }
26
27 - (void)viewDidLoad
28 {
29 [super viewDidLoad];
30
31
32 // 创建中心设备
33 CBCentralManager *cbMgr = [[CBCentralManager alloc] init];
34 self.cbMgr = cbMgr;
35
36 // 代理
37 cbMgr.delegate = self;
38
39 // 扫描外设
40 [cbMgr scanForPeripheralsWithServices:nil options:nil];
41 }
42
43
44 #pragma mark - CBCentralManager代理方法
45 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
46 {
47 // 扫描到得外设
48 if (![self.Peripherals containsObject:peripheral]){
49
50 // 外设代理
51 peripheral.delegate = self;
52
53 [self.Peripherals addObject:peripheral];
54 }
55 }
56
57 // 连接外设
58 - (IBAction)peripheralConnectSuccess
59 {
60 for (CBPeripheral *peripheral in self.Peripherals) {
61
62 // 连接外设
63 [self.cbMgr connectPeripheral:peripheral options:nil];
64 }
65 }
66
67
68 // 外设连接成功会调用
69 - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
70 {
71 // 扫描服务
72 [peripheral discoverServices:nil];
73 }
74
75 // 外设连接失败
76
77 - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
78 {
79
80 }
81
82 #pragma mark - Peripheral代理
83 // 扫描到服务就会调用
84 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
85 {
86 NSArray *services = peripheral.services;
87 for (CBService *service in services) {
88
89 // 某服务存在
90 if ([service.UUID.UUIDString isEqualToString:@"xxx"]){
91
92 [peripheral discoverCharacteristics:nil forService:service];
93 }
94 }
95 }
96
97 // 扫描到特征就会调用
98 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
99 {
100 NSArray *characters = service.characteristics;
101
102 for (CBCharacteristic *character in characters) {
103
104 if ([character.UUID.UUIDString isEqualToString:@"xxx"]){
105
106 // 进行设置
107 }
108 }
109 }