zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    加法&除法
    [转] KMP算法
    软件测试视频集
    集成测试的目的和意义
    UNIX常用命令简介
    软件测试V模型
    集成测试、单元测试与系统测试的差别
    软件测试的基本概念和方法
    软件测试工程师 笔试题
    软件测试
  • 原文地址:https://www.cnblogs.com/GeekStar/p/4466065.html
Copyright © 2011-2022 走看看