Fork me on GitHub

[转]关于苹果蓝牙的研究

之前有个研究任务安排给我:对蓝牙耳机断线通知进行分析研究,后来由于缺少设备测试而终止,但是在前期分析研究中,获益不少,故整理如下:

一、要求:

蓝牙耳机掉线通知研究,看断开能否得到通知,能否识别主动断开,还是距离过远而断开,完成后提交研究报告和相关Demo

二、分析:

1、关于苹果蓝牙:是鸡肋  功能很有限

  • 不支持文件传输系统
  • 支持蓝牙耳机
  • 在玩游戏时能进行联机对战
  • 可利用提供的GameKit 框架和CoreBuletooth框架实现2设备之间的通信,不过还是有一定限制

2、思路

  • 设备(如iphone)首先检测到蓝牙耳机,建立连接
  • 寻找API,与蓝牙耳机进行交互,获得其状态通知
  • 分析其状态通知,判断断开连接的原因,返回结果提示

三、结果

理论上可实现与外围蓝牙设备进行通信,但缺少硬件设备(MFI进行测试

四、关于API

目前苹果的蓝牙技术大部分还是封闭的,针对蓝牙技术,提供有如下API,具体分析见下

  1. CoreBluetooth. framework分析结果
    • iOS5.0拥有的,即仅支持iOS5.0及其以上版本
    • API可以连接蓝牙为4.0且支持BLE设备
    • framework须在iOS5.0及其以上版本使用
    • 样无法实现与蓝牙耳机的交互

Demo

2)GameKit. framework分析结果

    • 支持iOS3.0以上版本使用
    • 拥有GKPeerPickerControllerGKSession,通过这两个类我们可以将两台iPhone使用蓝牙给连接起来并使相互之间可以发送/接收消息。
      1. GKPeerPickerController:提供一套系统界面最终使多台设备之间的蓝牙连接起来,并提供了蓝牙可用的通知
      2. GKSession:提供将多个蓝牙连接在一起之后的会话处理,发送消息,接收消息,某个蓝牙设备断开等
    • 无法实现与蓝牙耳机之间的通信。

Demo

3)ExternalAccessory. framework分析结果

  • ExternalAccessory 框架提供了和连接到 iOS 设备的配件通讯的渠道。
  • 蓝牙外设需被Apple认证,具有MFI这样配件会明确提供支持的命令协议,这种协议用来在配件和关联应用中传送数据。否则应用无法搜索到配件,即使配件已经连接在设备上。下图是EADemoPlist文件里面支持的协议:

  • 分析了ExternalAccessory. framework官方文档,以及EADemo,理论上是可以与认证的蓝牙外设建立通讯,由于硬件原因,暂无法测试。

Demo

五、扩展范围的分析结果

针对苹果蓝牙技术的分析,扩展了范畴,对越狱设备的蓝牙,以及2设备蓝牙连接后断开的情况进行了分析如下

1、越狱情况

由于Apple蓝牙的使用门槛设置的很高,未越狱的设备仅可通过蓝牙听歌接电话,无法互传文件等。但是越狱后虽然用户权限升为RW,能够利用蓝牙传送文件等,但是往往会出现诸多问题,其中最多的就是搜索不到外设。而且第三方的蓝牙程序可能与自带蓝牙程序发生冲突,导致设备蓝牙无法使用等情况。

2、 设备间(如iPhone/iPod蓝牙相连断开的情况

利用Apple提供的GameKit. framework完成了2设备蓝牙连接通信的Demo设备建蓝牙连接后会话处理都是GKSession所提供,具体分析如下:

蓝牙状态变化会调用

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state

其中:

typedef enum
 {
  GKPeerStateAvailable,    // not connected to session, but available for connectToPeer:withTimeout:
  GKPeerStateUnavailable,  // no longer available
  GKPeerStateConnected,    // connected to the session
  GKPeerStateDisconnected, // disconnected from the session
  GKPeerStateConnecting,   // waiting for accept, or deny response
 } GKPeerConnectionState;

蓝牙的状态有:可用,不可用,已连接,已断开,正在连接。同时GKSession还提供收到另一个peer连接错误或者失败的方法。

转载自:wwmusic的专栏

posted @ 2013-05-23 14:49  木狼君  阅读(561)  评论(0编辑  收藏  举报