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

一、要求:

蓝牙耳机掉线通知研究,看断开能否得到通知,能否识别主动断开,还是距离过远而断开,完成后提交研究报告和相关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以上版本使用
  • 拥有GKPeerPickerController、GKSession,通过这两个类我们可以将两台iPhone使用蓝牙给连接起来并使相互之间可以发送/接收消息。
  1. GKPeerPickerController:提供一套系统界面最终使多台设备之间的蓝牙连接起来,并提供了蓝牙可用的通知
  2. GKSession:提供将多个蓝牙连接在一起之后的会话处理,如发送消息,接收消息,某个蓝牙设备断开等
  • 无法实现与蓝牙耳机之间的通信。

Demo参见

3)ExternalAccessory. framework分析结果

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

ios蓝牙后台扫描 苹果蓝牙识别_Apple

  • 分析了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,连接错误或者失败的方法。