(九十三)蓝牙的基本使用
蓝牙在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
(九十三)蓝牙的基本使用相关推荐
- JavaScript学习(九十三)—选择排序和冒泡排序
JavaScript学习(九十三)-选择排序和冒泡排序 点我查看之前写过的 前端十大经典算法文章
- 三 蓝牙低功耗(BLE)协议栈 之 HCI层
一 HCI介绍 HCI (Host Controller interface), 为Host访问Controller提供一组标准的接口. 主要完成3个任务: Host通过HCI发送命令给Control ...
- Android开发笔记(九十三)装饰模式
基本概念 装饰模式是扩展功能用的一种设计模式, 一般要扩展功能,我们都会想到继承,可是继承只能继承一个基类,如果有多个条件需要分别进行扩展,那得写好几个派生类,条件越多派生类的数量也越多. 上面描述比 ...
- DIY智能插座(三) -- 蓝牙POS机改造
淘宝上可以搜到不少蓝牙POS,1毛包邮,当蓝牙串口蛮不错的.本人淘的一款叫开店宝. 下面开始拆机改造了,哈哈~ 串口可以直接找到测试点焊盘,蛮好焊接的,bootm0引脚拉高,可以进入Download模 ...
- 【数学建模】MATLAB应用实战系列(九十三)-岭回归应用案例(附MATLAB和Python代码)
前言 岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息.降低精度为代价获得回归系数更为符合实际.更可靠的回归方法,对病态 ...
- 九十三、动态规划系列之股票问题(下)
@Author:Runsen 动态规划必须要面对股票系列,背包系列差不多了,那就上吧. 股票买卖这一类的问题,都是给一个输入数组,里面的每个元素表示的是每天的股价,并且你只能持有一支股票(也就是你必须 ...
- C语言九十三之输入一个字符x,找到输入的那句话(字符串)里面一样字母的位置。
1.题目 输入一个字符x,找到输入的那句话里面一样字母的位置. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科目.帮助C语言学者打好程序基础.C语言基础,锻 ...
- android wifi连接流程,(九十三) Android O 连接WiFi AP流程梳理续——保存网络-Go语言中文社区...
前言: 之前在(五十五)Android O 连接WiFi AP流程梳理 梳理连接流程梳理到SupplicantStaNetworkHal 然后没梳理的下去,现在继续梳理下. 之前梳理的时序图 1.流程 ...
- (九十三) Android O 连接WiFi AP流程梳理续——保存网络
前言: 之前在(五十五)Android O 连接WiFi AP流程梳理 梳理连接流程梳理到SupplicantStaNetworkHal 然后没梳理的下去,现在继续梳理下. 之前梳理的时序图 1.流程 ...
最新文章
- 人工神经外网络中为什么ReLu要好过于Tanh和Sigmoid Function?
- hibernate------java-delete-insert-update
- 【SQL编程】Greenplum 实现树结构+自定义函数+避免函数重复调用+ function cannot execute on a QE slice 问题处理(优化过程全记录)
- xml 转map dom4j
- DDL与DML的区别
- 可口可乐在人工智能和大数据领域的7项应用
- AI 时代,为什么程序员很贵?
- 利用veiw建立Centos5.5 双机智能DNS手册
- c语言语句的机器级表示实训,深入理解计算机系统(笔记):程序的机器级表示...
- 理解EMM:是更好地管理移动性的关键所在
- CentOS镜像中替换安装镜像的小系统的内核方法
- 于的繁体字有几种写法_“二”的繁体字有几种写法
- 使用友盟+实现第三方登录(QQ、微信、微博)
- 电商业务容器化遇瓶颈,公有云Docker镜像P2P加速很安全
- Devise Gem简介
- 【战神引擎】游戏不开门怎么解决?
- 【Python项目】Flask + MySQL 实现用户注册,登录、注销
- MBA-day33 绝对值的几何意义
- 【原创】Themida 2260 虚拟机 FISH 初探(一)
- idea设置放大缩小_苹果手机连按3下,能打开隐藏放大镜功能,看什么都一清二楚...
热门文章
- unity webgl读写txt文件_python Files文件读写操作
- python selenium循环判断元素是否存在_检查Python Selenium是否存在元素
- 【安卓开发 】Android初级开发(十)Android中app自动更新版本号比较
- 万维网发布服务 w3svc 已停止 除非万维_万维网和互联网的区别
- 什么是C语言中的隐式函数声明?
- 什么时候会是用treeset?_flex:1 到底代表什么?
- 精简指令和复杂指令计算机,CPU精简指令集和复杂指令集的区别
- hot编码 字符one_One Hot编码是什么?为什么要用它,什么时候用它?
- 光纤收发器产品的光电介质转换芯片选择性能指标介绍
- [渝粤教育] 广东-国家-开放大学 21秋期末考试基础会计10258k2