zoukankan      html  css  js  c++  java
  • (九十三)蓝牙的基本使用

    蓝牙在GameKit框架中实现,可以实现文件传递和游戏通信等,蓝牙的缺点是不能得到文件传输的进度,因此不宜传输大文件。

    使用蓝牙的一般步骤如下:

    ①创建蓝牙设备拾取器,类似于图片拾取器,通过代理方法获取拾取到的设备,调用show方法来显示拾取器。

    GKPeerPickerController *peerC = [[GKPeerPickerController alloc] init];
    peerC.delegate = self;
    [peerC show];
    要遵循UINavigationControllerDelegate,GKPeerPickerControllerDelegate协议。

    ②通过代理方法获取拾取到的设备,存储这个会话,然后dismiss拾取器视图,记得要存储会话,注意为了接收数据,应该调用会话的setDataReceiveHandler::方法:

    - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session{
        
        _session = session;
        // 设置谁来处理数据
        [session setDataReceiveHandler:self withContext:NULL];
        [picker dismiss];
        
    }

    接收数据的方法既不是代理,也不是通知,因此必须和帮助文档中写的一样,方法如下:

    - (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context{
        
        // data就是接收到的二进制数据
        
    }
    ③要发送蓝牙数据,通过session的sendDataToAllPeers:::实现,其中withDataMode用于选择是可靠传输还是不可靠传输,类似TCP和UDP,下面的代码演示了发送一张图片的过程。

    - (IBAction)send:(id)sender {
        
        NSData *data = UIImagePNGRepresentation(_imageView.image);
        NSError *err = nil;
        // 可靠连接可以保证一定送到,不可靠只负责发送
        [_session sendDataToAllPeers:data withDataMode:GKSendDataUnreliable error:&err];
        if (err) {
            NSLog(@"%@",err);
        }
        
    }

    【实例】

    下面的例子演示了一个发送图片的例程,有一张图片imageView,三个按钮,分别是连接(connect方法)、选择(choosePic)、发送(send),点击选择从照片图库中选择一张图片,点击连接建立会话,点击发送将图片通过会话发送出去。

    //
    //  ViewController.m
    //  蓝牙基本使用
    //
    //  Created by 11 on 7/27/15.
    //  Copyright (c) 2015 soulghost. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <GameKit/GameKit.h>
    
    @interface ViewController () <UIImagePickerControllerDelegate,UINavigationControllerDelegate,GKPeerPickerControllerDelegate>
    
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
    @property (weak, nonatomic) GKSession *session;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
     
    }
    
    - (IBAction)connect:(id)sender {
        
        // 创建蓝牙设备选择器View,设置代理并且显示、
        GKPeerPickerController *peerC = [[GKPeerPickerController alloc] init];
        peerC.delegate = self;
        [peerC show];
        
    }
    - (IBAction)choosePic:(id)sender {
        
        if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]){
            NSLog(@"图库不可用");
            return;
        }
        
        UIImagePickerController *imgPickerC = [[UIImagePickerController alloc] init];
        imgPickerC.delegate = self;
        imgPickerC.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
        [self presentViewController:imgPickerC animated:YES completion:nil];
        
        
    }
    - (IBAction)send:(id)sender {
        
        NSData *data = UIImagePNGRepresentation(_imageView.image);
        NSError *err = nil;
        // 可靠连接可以保证一定送到,不可靠只负责发送
        [_session sendDataToAllPeers:data withDataMode:GKSendDataUnreliable error:&err];
        if (err) {
            NSLog(@"%@",err);
        }
        
    }
    
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
        
        //NSLog(@"%@",info);
        UIImage *image = info[UIImagePickerControllerOriginalImage];
        _imageView.image = image;
        [self imagePickerControllerDidCancel:picker];
        
    }
    
    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
        [picker dismissViewControllerAnimated:YES completion:nil];
    }
    
    - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session{
        
        _session = session;
        // 设置谁来处理数据
        [session setDataReceiveHandler:self withContext:NULL];
        [picker dismiss];
        
    }
    
    // 通过看setDataReceiveHandler的帮助得到,只要实现了即可
    // 接收到其他设备传来的数据时调用
    - (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context{
        
        UIImage *image = [UIImage imageWithData:data];
        _imageView.image = image;
        
    }
    
    @end
    

  • 相关阅读:
    [LUOGU] P2196 挖地雷
    [LUOGU] P1020 导弹拦截
    [LUOGU] P2543 [AHOI2004]奇怪的字符串
    [LUOGU] P2759 奇怪的函数
    [LUOGU] P1048 采药
    [LUOGU] P1396 营救
    [LUOGU] P1196 [NOI2002]银河英雄传说
    [LUOGU] 2820 局域网
    知识点
    swich使用
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154102.html
Copyright © 2011-2022 走看看