之前有个研究任务安排给我:对蓝牙耳机断线通知进行分析研究,后来由于缺少设备测试而终止,但是在前期分析研究中,获益不少,故整理如下:
一、要求:
蓝牙耳机掉线通知研究,看断开能否得到通知,能否识别主动断开,还是距离过远而断开,完成后提交研究报告和相关Demo。
二、分析:
1、关于苹果蓝牙:是鸡肋 功能很有限
- 不支持文件传输系统
- 支持蓝牙耳机
- 在玩游戏时能进行联机对战
- 可利用提供的GameKit 框架和CoreBuletooth框架实现2设备之间的通信,不过还是有一定限制
2、思路
- 设备(如iphone)首先检测到蓝牙耳机,建立连接
- 寻找API,与蓝牙耳机进行交互,获得其状态通知
- 分析其状态通知,判断断开连接的原因,返回结果提示
三、结果:
理论上可实现与外围蓝牙设备进行通信,但缺少硬件设备(MFI)进行测试
四、关于API
目前苹果的蓝牙技术大部分还是封闭的,针对蓝牙技术,提供有如下API,具体分析见下
- CoreBluetooth. framework分析结果
- iOS5.0才拥有的,即仅支持iOS5.0及其以上版本
- 其API可以连接蓝牙为4.0且支持BLE的设备
- 此framework必须在iOS5.0及其以上版本使用
- 同样无法实现与蓝牙耳机的交互
(Demo参见)
2)GameKit. framework分析结果
-
- 支持iOS3.0以上版本使用
- 拥有GKPeerPickerController、GKSession,通过这两个类我们可以将两台iPhone使用蓝牙给连接起来并使相互之间可以发送/接收消息。
-
-
- GKPeerPickerController:提供一套系统界面最终使多台设备之间的蓝牙连接起来,并提供了蓝牙可用的通知
- GKSession:提供将多个蓝牙连接在一起之后的会话处理,如发送消息,接收消息,某个蓝牙设备断开等
-
-
- 无法实现与蓝牙耳机之间的通信。
(Demo参见)
3)ExternalAccessory. framework分析结果
- ExternalAccessory 框架提供了和连接到 iOS 设备的配件通讯的渠道。
- 蓝牙外设需被Apple认证,具有MFI。这样配件会明确提供支持的命令协议,这种协议用来在配件和关联应用中传送数据。否则应用无法搜索到配件,即使配件已经连接在设备上。下图是EADemo中Plist文件里面支持的协议:
- 分析了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的专栏