(九十三)蓝牙的基本使用
Posted 我们都曾拥有最美的时光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(九十三)蓝牙的基本使用相关的知识,希望对你有一定的参考价值。
蓝牙在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
以上是关于(九十三)蓝牙的基本使用的主要内容,如果未能解决你的问题,请参考以下文章
第一百九十三节,jQuery EasyUI,Draggable(拖动)组件