蓝牙相关框架的简单了解

iOS开发 蓝牙相关

最近看了几个与蓝牙相关的框架,这里分享给大家。下面提到的三个框架,大家可以看一下,其实涉及到蓝牙开发的方法并没有那么复杂。

一、GameKit

iOS3~iOS7之间使用的框架是GameKit,它是最基本的蓝牙通信框架。连接的必须是两个设备上的同一个应用。连接后可以进行文件的共享,但是仅限于沙盒内的文件。该框架一般用于游戏。

  1. 开发流程 首先要引入框架:#import <GameKit/GameKit.h>
  2. 搜索蓝牙设备
  • 创建蓝牙搜索选择器
GKPeerPickerController *pickerController = [[GKPeerPickerController alloc]init];    
pickerController.delegate = self;
[pickerController show]; 
  • 重要的代理方法
// 连接蓝牙的方式  在线  附近
  -(void)peerPickerController:(GKPeerPickerController\*)picker didSelectConnectionType:(GKPeerPickerConnectionType)type {}
// 获取会话的方式  在线  附近
  -(GKSession\*)peerPickerController:(GKPeerPickerController\*)picker sessionForConnectionType:(GKPeerPickerConnectionType)type {
        return nil;
     }
     /*
*peerID:连接成功的设备的ID
*session:当前会话 需要保存下来 才能进行数据的传递
 */
-(void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {
        // 成功后隐藏连接设备界面
        [picker dismiss];
        // 接受数据的回调 在GameKit中 必须实现********
        [session setDataReceiveHandler:self withContext:nil];
        // 保存连接成功后创建的会话 (很重要)
        self.session = session;
}
// 只要有数据传递过来就会调用(与********方法协同使用)
-(void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context {
       if (!data) return;
       self.image.image = [UIImage imageWithData:data];
}
// 退出
-(void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker {} 
  • 发送数据
// GKSendDataReliable 安全模式 依次发送只要有一个发送不成功则终止    
// GKSendDataUnreliable 不安全模式 群发,需要响应,所以也需要设置请求超时
    [self.session sendDataToAllPeers:data withDataMode:GKSendDataUnreliable error:nil];
  • 接受数据回调(我们在上面提到的代理中接受数据的回调)

二、mutipeerConnentivity

该框架是iOS7引入的一个全新的框架用来替换GameKit。特点:多点连接、多用于文件的传输、iOS设备不联网也能跟附近的人聊天。

搜索和传输的方式:① 双方WiFi和蓝牙都没打开:无法完成 ② 双方都开启蓝牙:通过蓝牙发送和传输 ③ 双方都开启WiFi:通过WiFi Direct发现和传输,速度接近AirDrop ④ 双方同时开启了WiFi和蓝牙:模拟AirDrop,通过低功耗蓝牙技术扫描发现握手,然后通过WiFi Direct传输。

开发流程:

 ① 注册广告 告诉别人 我的设备可以被发现
 ② 扫描蓝牙设备 实现代理方法
 ③ 使用一个MCSession对象存储当前会话 实现代理方法
 ④ 使用MCSession对象 发送和接受数据
  • 首先设置一些用到的属性
// 广告标识
#define SERVICE_TYPE @"XXW"
@interface ViewController ()
<MCBrowserViewControllerDelegate,
UIImagePickerControllerDelegate,
UINavigationControllerDelegate,MCSessionDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *ImageView;// 保存会话
@property (strong, nonatomic) MCSession *session;// 发布广告 (延长其生命周期使之持续发布广告)
@property (strong, nonatomic) MCAdvertiserAssistant *assistant;// 当前连接到的设备的peerID
@property (strong, nonatomic) MCPeerID *peerID;
@end
  • 这里我们添加几个按钮并关联响应的处理事件
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // 根据设备编号创建用户标志peerID    
    MCPeerID *peerId = [[MCPeerID alloc]initWithDisplayName:[UIDevice currentDevice].name];    
    self.session = [[MCSession alloc]initWithPeer:peerId];    
    self.session.delegate = self;
}
- (IBAction)connectAction:(id)sender {    
     MCBrowserViewController *browserVC = [[MCBrowserViewController alloc]initWithServiceType:SERVICE_TYPE session:self.session]; 
     browserVC.delegate = self;
     [self presentViewController:browserVC animated:YES completion:nil];
}
- (IBAction)selectImg:(id)sender {    
    UIImagePickerController *imgPicker = [[UIImagePickerController alloc]init];
    imgPicker.delegate = self;
    imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    [self presentViewController:imgPicker animated:YES completion:nil];
}
- (IBAction)sendImg:(id)sender {
    if (!self.ImageView.image) return;
    NSData *data = UIImagePNGRepresentation(self.ImageView.image);
    [self.session sendData:data toPeers:@[self.peerID] withMode:MCSessionSendDataUnreliable error:nil];
}
// 设置可以被发现
- (IBAction)found:(id)sender {
    UISwitch *mySwitch = (UISwitch *)sender;
    if (mySwitch.isOn) {
        // 注册一个广告 可能一个app发送了多个广告 所以需要给广告绑定一个唯一标示
        self.assistant = [[MCAdvertiserAssistant alloc]initWithServiceType:SERVICE_TYPE discoveryInfo:nil session:self.session];
        // 发布广告(当该代码块执行完成后,创建的变量就会被销毁,所以要延长其生命周期,使之持续发布广告)
        [_assistant start];
    }
  • 代理方法的实现
#pragma mark -- 扫描设备的代理 --
// 连接成功
- (void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController {
    [browserViewController dismissViewControllerAnimated:YES completion:nil];
}
// 退出连接
- (void)browserViewControllerWasCancelled:(MCBrowserViewController *)browserViewController {
    [browserViewController dismissViewControllerAnimated:YES completion:nil];
}
// 连接那个设备
- (BOOL)browserViewController:(MCBrowserViewController *)browserViewController shouldPresentNearbyPeer:(MCPeerID *)peerID withDiscoveryInfo:(nullable NSDictionary<NSString *, NSString *> *)info {
    self.peerID = peerID;
    return YES;
}

#pragma mark -- session会话的代理方法 --
// 该方法必须实现,不然程序会崩
- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state {}
// 获取数据回调
- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {
    dispatch_async(dispatch_get_main_queue(), ^{
       self.ImageView.image = [UIImage imageWithData:data];
    });
}
#pragma mark -- 图片获取器代理方法 --
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
    self.ImageView.image = info[UIImagePickerControllerOriginalImage];
    [picker dismissViewControllerAnimated:YES completion:nil];}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [picker dismissViewControllerAnimated:YES completion:nil];
}

三、CoreBlueTooth

  • 简介:① 可用于第三方蓝牙设备交互,但是设备必须支持蓝牙4.0,没有同一应用下这个限制。② iPhone的设备必须是4S或更新。③ iPad设备必须是iPad mini或更新。④ iOS的系统必须是iOS 6或更新。⑤ 蓝牙4.0以“低功耗”著称,所以一直被称为BLE(bluetooth low energy)。
  • 条件限制:① 使用模拟器进行调试必须满足:Xcode 4.6 iOS 6.1 (只限于这个版本,既不能高也不能低)。 ② 使用场景:运动手环、智能家居、拉卡拉蓝牙刷卡器。
  • 核心概念:① CBCentralManager:中心设备(用来连接到外部设备的管家)② CBPeripheralManager:外部设备(第三方的蓝牙4.0设备)
  • 开发步骤:① 建立中心管家 ② 扫描外设(discover) ③ 连接外设 ④ 扫描外设中的服务和特征(服务和特征的关系) ⑤ 与外设做数据交换(在指定的特征下做相应的操作)⑥ 断开连接

总结

这里是我对蓝牙开发框架的简单了解,因为设备能力有限无法进行实际的验证,非常抱歉。但是还是希望能够有时间进行深入的学习。在我接触的过程中,发现蓝牙开发也不是那么的复杂,可能实际操作起来也不会很容易。当前最流行的是使用CoreBluetooth框架进行蓝牙的开发(简称BLE),因为时间有限,暂时还没有对此进行深入的学习,希望有时间能够完成进一步的学习吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 前言# 什么是蓝牙?#### 随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术...
    maybe_mylove阅读 958评论 1 5
  • Guide to BluetoothSecurity原文 本出版物可免费从以下网址获得:https://doi.o...
    公子小水阅读 7,879评论 0 6
  • 在iOS中框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其他资源。共...
    wo不懂阅读 1,404评论 3 3
  • 读书不一定有用,认知迭代和系统升级才是最终目的;与人交流也不一定能成长,这种习惯能让人学会换位思考,学会与他人不同。
    唯虫阅读 153评论 0 0
  • 生活给我的囚笼有五百平方多米 极大但也极易冲破 而我给自己的造的囚笼 小且紧致 有时竟让心脏也不能够跳动 我的双手...
    甜味阿_阅读 202评论 0 1