iOS 蓝牙(GameKit CoreBluetooth)

  利用GameKit框架实现ios设备的蓝牙通讯,导入框架:#import <GameKit/GameKit.h>  , 注意: 此框架只能用于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 }
欢迎加QQ群交流: iOS: 279096195 React Native: 482205185
原文地址:https://www.cnblogs.com/GeekStar/p/4466065.html