蓝牙在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

转载于:https://www.cnblogs.com/aiwz/p/6154102.html

(九十三)蓝牙的基本使用相关推荐

  1. JavaScript学习(九十三)—选择排序和冒泡排序

    JavaScript学习(九十三)-选择排序和冒泡排序 点我查看之前写过的 前端十大经典算法文章

  2. 三 蓝牙低功耗(BLE)协议栈 之 HCI层

    一 HCI介绍 HCI (Host Controller interface), 为Host访问Controller提供一组标准的接口. 主要完成3个任务: Host通过HCI发送命令给Control ...

  3. Android开发笔记(九十三)装饰模式

    基本概念 装饰模式是扩展功能用的一种设计模式, 一般要扩展功能,我们都会想到继承,可是继承只能继承一个基类,如果有多个条件需要分别进行扩展,那得写好几个派生类,条件越多派生类的数量也越多. 上面描述比 ...

  4. DIY智能插座(三) -- 蓝牙POS机改造

    淘宝上可以搜到不少蓝牙POS,1毛包邮,当蓝牙串口蛮不错的.本人淘的一款叫开店宝. 下面开始拆机改造了,哈哈~ 串口可以直接找到测试点焊盘,蛮好焊接的,bootm0引脚拉高,可以进入Download模 ...

  5. 【数学建模】MATLAB应用实战系列(九十三)-岭回归应用案例(附MATLAB和Python代码)

    前言 岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息.降低精度为代价获得回归系数更为符合实际.更可靠的回归方法,对病态 ...

  6. 九十三、动态规划系列之股票问题(下)

    @Author:Runsen 动态规划必须要面对股票系列,背包系列差不多了,那就上吧. 股票买卖这一类的问题,都是给一个输入数组,里面的每个元素表示的是每天的股价,并且你只能持有一支股票(也就是你必须 ...

  7. C语言九十三之输入一个字符x,找到输入的那句话(字符串)里面一样字母的位置。

    1.题目 输入一个字符x,找到输入的那句话里面一样字母的位置. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科目.帮助C语言学者打好程序基础.C语言基础,锻 ...

  8. android wifi连接流程,(九十三) Android O 连接WiFi AP流程梳理续——保存网络-Go语言中文社区...

    前言: 之前在(五十五)Android O 连接WiFi AP流程梳理 梳理连接流程梳理到SupplicantStaNetworkHal 然后没梳理的下去,现在继续梳理下. 之前梳理的时序图 1.流程 ...

  9. (九十三) Android O 连接WiFi AP流程梳理续——保存网络

    前言: 之前在(五十五)Android O 连接WiFi AP流程梳理 梳理连接流程梳理到SupplicantStaNetworkHal 然后没梳理的下去,现在继续梳理下. 之前梳理的时序图 1.流程 ...

最新文章

  1. 人工神经外网络中为什么ReLu要好过于Tanh和Sigmoid Function?
  2. hibernate------java-delete-insert-update
  3. 【SQL编程】Greenplum 实现树结构+自定义函数+避免函数重复调用+ function cannot execute on a QE slice 问题处理(优化过程全记录)
  4. xml 转map dom4j
  5. DDL与DML的区别
  6. 可口可乐在人工智能和大数据领域的7项应用
  7. AI 时代,为什么程序员很贵?
  8. 利用veiw建立Centos5.5 双机智能DNS手册
  9. c语言语句的机器级表示实训,深入理解计算机系统(笔记):程序的机器级表示...
  10. 理解EMM:是更好地管理移动性的关键所在
  11. CentOS镜像中替换安装镜像的小系统的内核方法
  12. 于的繁体字有几种写法_“二”的繁体字有几种写法
  13. 使用友盟+实现第三方登录(QQ、微信、微博)
  14. 电商业务容器化遇瓶颈,公有云Docker镜像P2P加速很安全
  15. Devise Gem简介
  16. 【战神引擎】游戏不开门怎么解决?
  17. 【Python项目】Flask + MySQL 实现用户注册,登录、注销
  18. MBA-day33 绝对值的几何意义
  19. 【原创】Themida 2260 虚拟机 FISH 初探(一)
  20. idea设置放大缩小_苹果手机连按3下,能打开隐藏放大镜功能,看什么都一清二楚...

热门文章

  1. unity webgl读写txt文件_python Files文件读写操作
  2. python selenium循环判断元素是否存在_检查Python Selenium是否存在元素
  3. 【安卓开发 】Android初级开发(十)Android中app自动更新版本号比较
  4. 万维网发布服务 w3svc 已停止 除非万维_万维网和互联网的区别
  5. 什么是C语言中的隐式函数声明?
  6. 什么时候会是用treeset?_flex:1 到底代表什么?
  7. 精简指令和复杂指令计算机,CPU精简指令集和复杂指令集的区别
  8. hot编码 字符one_One Hot编码是什么?为什么要用它,什么时候用它?
  9. 光纤收发器产品的光电介质转换芯片选择性能指标介绍
  10. [渝粤教育] 广东-国家-开放大学 21秋期末考试基础会计10258k2