iOS开发 蓝牙蓝牙

实用框架:
CoreBluetooth.framework(时下热门)
可用于第三方蓝牙设备交互,必须要支持蓝牙4.0
硬件至少是4s,系统至少是iOS6
蓝牙4.0以低功耗著称,一般也叫BLE(Bluetooth Low Energy)
目前应用比较多的案例:运动手坏、嵌入式设备、智能家居

Core Bluetooth测试比较麻烦,正常情况下,得至少有2台真实的蓝牙4.0设备

如何让iOS模拟器也能测试蓝牙4.0程序?
买一个CSR蓝牙4.0 USB适配器,插在Mac上
在终端输入sudo nvram bluetoothHostControllerSwitchBehavior="never"
重启Mac
用Xcode 4.6调试代码,将程序跑在iOS 6.1的模拟器上
(苹果把iOS 7.0模拟器对BLE的支持移除掉了)

Core Bluetooth的核心结构图:


6FB99117-C347-47FA-ADAB-A5560BA5E5C5.png

Core Bluetooth的基本常识:
每个蓝牙4.0设备都是通过服务(Service)和特征(Characteristic)来展示自己的
一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征

特征是与外界交互的最小单位
比如说,一台蓝牙4.0设备,用特征A来描述自己的出厂信息,用特征B来收发数据

服务和特征都是用UUID来唯一标识的,通过UUID就能区别不同的服务和特征

设备里面各个服务(service)和特征(characteristic)的功能,均由蓝牙设备硬件厂商提供,比如哪些是用来交互(读写),哪些可获取模块信息(只读)等

Core Bluetooth的开发步骤:
建立中心设备
// 1.创建一个蓝牙对象
self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];

扫描外设(Discover Peripheral):
// 2.进行检索操作
// nil: 任意的外设
[self.manager scanForPeripheralsWithServices:nil options:nil];

连接外设(Connect Peripheral):
// 3.如果发现了蓝牙设备,就会调用这个方法

  • (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI;
    {
    // 4.连接外设(别的蓝牙设备)
    [self.manager connectPeripheral:peripheral options:0];
    }
    扫描外设中的服务和特征(Discover Services And Characteristics):
    // 5.连接上某个设备后,调用这个方法

  • (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
    {
    // 6.尝试发现外设的某项服务
    [peripheral discoverServices:nil];

    peripheral.delegate = self;
    }

利用特征与外设做数据交互(Explore And Interact):
// 7.如果发现某一项服务,就调用这个方法

  • (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error;
    {
    if (error) {

    return;
    }
    for (CBService *service in peripheral.services) {

if ([service.UUID.UUIDString isEqualToString:@"123"]) {
// 寻找所对应的特征
[peripheral discoverCharacteristics:nil forService:service];
}
}
}
// 8.找到这个服务所组成的特征时,调用这个方法

  • (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
    {
    NSLog(@"可以进行一些通讯操作.传值操作");
    }

// 如果蓝牙的状态改变的话,就会调用这个方法
// 这个方法一定要实现,要不然会出错.

  • (void)centralManagerDidUpdateState:(CBCentralManager *)central;
    {
    NSLog(@"蓝牙的状态改变了");
    }

更多框架:
GameKit.framework(用法简单)
只能用于iOS设备之间的连接,多用于游戏(比如五子棋对战),从iOS7开始过期

MultipeerConnectivity.framework
只能用于iOS设备之间的连接,从iOS7开始引入,用于替代GameKit

ExternalAccessory.framework
可用于第三方蓝牙设备交互,但是蓝牙设备必须经过苹果MFi认证(国内较少)

简单介绍GameKit:
使用GameKit框架,可以在游戏中增加对等连接,又称对端连接或点对点连接,Peer To Peer。
使用GameKit框架中的对等网络连接API,可以在游戏玩家之间建立一个对等网络,并在游戏/应用实例之间交换数据。
GameKit框架可以使用蓝牙在玩家之间创建网络,玩家甚至不需要连接到互联网,就可以彼此对战。

通过蓝牙实现对等网络连接:
1.为玩家双方呈现一个GKPeerPickerController,提供了一个标准的用户界面连接两台设备
2.ViewControoler遵循GKPeerPickerControllerDelegate协议,处理来自GKPeerPickerController(对端选择器)的信息
3.建立连接后,使用GKSession类可以向对端设备发送数据
4.在receiveData:fromPeer:inSession:context代理方法中编写代码来处理接收到的数据

GameKit的蓝牙开发步骤:

显示可以连接的蓝牙设备列表
GKPeerPickerController *ppc = [[GKPeerPickerController alloc] init];
ppc.delegate = self;
[ppc show];

在代理方法中监控蓝牙的连接
-(void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {
NSLog(@"连接到设备:%@", peerID);
// 关闭蓝牙设备显示界面
[picker dismiss];
// 设置接收到蓝牙数据后的监听器
[session setDataReceiveHandler:self withContext:nil];
// 保存session
self.session = session;
}

处理接收到的蓝牙数据
-(void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context {

}

利用GKSession给其他设备发送数据
给指定的连接设备发送数据
-(BOOL)sendData:(NSData)datatoPeers:(NSArray)peerswithDataMode:(GKSendDataMode)mode error:(NSError *)error;
给所有连接的设备发送数据
-(BOOL)sendDataToAllPeers:(NSData
)datawithDataMode:(GKSendDataMode)mode error:(NSError **)error;

GameKit的蓝牙开发注意:

只能用于iOS设备之间的连接

只能用于同一个应用程序之间的连接

最好别利用蓝牙发送比较大的数据

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

推荐阅读更多精彩内容

  • 这里我们具体说明一下中心模式的应用场景。主设备(手机去扫描连接外设,发现外设服务和属性,操作服务和属性的应用。一般...
    丶逝水流年阅读 2,234评论 3 4
  • 首先进一则广告: 蓝牙技术联盟(Bluetooth SIG)2010年7月7日宣布,正式采纳蓝牙4.0核心规范(B...
    L泽阅读 1,426评论 3 4
  • iOS连接外设的代码实现流程 1. 建立中心角色 2. 扫描外设(discover) 3. 连接外设(connec...
    UILabelkell阅读 2,397评论 2 4
  • 时常在文学作品或小说中对主人翁的描绘那叫个完美,他们满腹经纶,睿智风趣,性格完美,经历着常人所不能的美鲜与凶残(不...
    神棍碎语阅读 293评论 3 0
  • 一直想去西藏,不知是一种执念亦或是信仰,总觉得西藏是我心灵的归属地,一直在犹豫、徘徊却始终不敢成行,大概也是怕失望...
    师太和老衲阅读 148评论 0 0