随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术正在一步步成熟,如今的大部分移动设备都配备有蓝牙4.0,相比之前的蓝牙技术耗电量大大降低。从iOS的发展史也不难看出苹果目前对蓝牙技术也是越来越关注,例如苹果于2013年9月发布的iOS7就配备了iBeacon技术,这项技术完全基于蓝牙传输。但是众所周知苹果的设备对于权限要求也是比较高的,因此在iOS中并不能像Android一样随意使用蓝牙进行文件传输(除非你已经越狱)。在iOS中进行蓝牙传输应用开发常用的框架有如下几种:GameKit.framework:iOS7之前的蓝牙通讯框架,从iOS7开始过期,但是目前多数应用还是基于此框架。
MultipeerConnectivity.framework:iOS7开始引入的新的蓝牙通讯开发框架,用于取代GameKit。
CoreBluetooth.framework:功能强大的蓝牙开发框架,要求设备必须支持蓝牙4.0。
前两个框架使用起来比较简单,但是缺点也比较明显:仅仅支持iOS设备,传输内容仅限于沙盒或者照片库中用户选择的文件,并且第一个框架只能在同一个应用之间进行传输(一个iOS设备安装应用A,另一个iOS设备上安装应用B是无法传输的)。当然CoreBluetooth就摆脱了这些束缚,它不再局限于iOS设备之间进行传输,你可以通过iOS设备向Android、Windows Phone以及其他安装有蓝牙4.0芯片的智能设备传输,因此也是目前智能家居、无线支付等热门智能设备所推崇的技术。下面我们基于CoreBlueTooth框架来实现响应的蓝牙功能。
CoreBluetooth简介
之前的GameKit和MultipeerConnectivity,都只能在iOS设备之间进行数据传输,大大降低了蓝牙的使用范围,因此从iOS6开始苹果推出了CoreBluetooth.framework,这个框架最大的特点就是完全基于BLE4.0标准并且支持非iOS设备。当前BLE应用相当广泛,不再仅仅是两个设备之间的数据传输,它还有很多其他应用市场,例如室内定位、无线支付、智能家居等等,这也使得CoreBluetooth成为当前最热门的蓝牙
CoreBluetooth实现蓝牙通信的原理
CoreBluetooth设计同样也是类似于客户端-服务器端的设计,作为服务器端的设备称为外围设备(Peripheral),作为客户端的设备叫做中央设备(Central)。外围设备和中央设备在CoreBluetooth中使用CBPeripheralManager和CBCentralManager表示。其中
CBPeripheralManager:外围设备通常用于发布服务、生成数据、保存数据。外围设备发布并广播服务,告诉周围的中央设备它的可用服务和特征。
CBCentralManager:中央设备使用外围设备的数据。中央设备扫描到外围设备后会就会试图建立连接,一旦连接成功就可以使用这些服务和特征。
注意:一台iOS设备(注意iPhone4以下设备不支持BLE,另外iOS7.0、8.0模拟器也无法模拟BLE)既可以作为外围设备又可以作为中央设备,但是不能同时即是外围设备又是中央设备,同时注意建立连接的过程不需要用户手动选择允许,这一点和前面两个框架是不同的,这主要是因为BLE应用场景不再局限于两台设备之间资源共享了。
下面我们来分别实现外围设备和中心设备的应用:
A:创建一个外围设备通常分为以下几个步骤:
步骤1:创建外围设备CBPeripheralManager对象并指定代理。
步骤2:创建特征CBCharacteristic、服务CBSerivce并添加到外围设备
步骤3:外围设备开始广播服务(startAdvertisting:)。
步骤4:和中央设备CBCentral进行交互。
下面是简单的程序示例,程序有两个按钮“广播”和“更新数据”,点击广播按钮则创建外围设备、添加服务和特征并开始广播,一旦发现有中央设备连接并订阅了此服务的特征则通过更新数据按钮更新特征数据,此时已订阅的中央设备就会收到更新数据。
外围设备程序实现流程如下图:
B:中央设备的创建一般可以分为如下几个步骤:
步骤1:创建中央设备管理对象CBCentralManager并指定代理。
步骤2:扫描外围设备,一般发现可用外围设备则连接并保存外围设备。
步骤3:查找外围设备服务和特征,查找到可用特征则读取特征数据。
下面是一个简单的中央服务器端实现,点击“开始搜索”按钮则开始扫描周围的外围设备,一旦发现了可用的外围设备则建立连接并设置外围设备的代理,之后开始查找其服务和特征。一旦外围设备的特征值做了更新,则可以在代理方法中读取更新后的特征值。
中央服务器端的实现流程图:
具体代码链接如下:http://pan.baidu.com/s/1skeJr7f
作者:蔡哲永
如果问题,请加QQ850270358,备注写解决问题,和我单独沟通哦。