本文是参考了网上众多资料总结。
做iOS开发也有很长时间了一直没有时间和机会做蓝牙方面的开发。2016年由于工作需要,开始接触蓝牙开发,刚开始做的时候在网上搜索各种文章,网上虽然关于这方面的东西也有很多,但是讲解的比较详细的少之又少。
一、iOS和蓝牙相关的框架
-
GameKit.framework
多用于游戏开发,仅限于iOS设备之间的连接。 -
MultipeerConnectivity.framework
这个就是iOS设备之间互相传文件用的。 -
ExternalAccessory.framework
这个框架可以用于和第三方蓝牙进行交互,但是必须是MFI(make for iPhone、iPad、iPod等设备),但是这种设备需要经过苹果的认证,而且比较困难,所以用的相当少。 -
CoreBluetooth.framework
主要用于和第三方蓝牙的交互,这个不需要苹果的认证,但是必须是蓝牙4.0以上的设备,蓝牙4.0也叫BLE(Bluetooth Low Energy)所以一般都称之为BlE开发,从iPhone4s及其以后的设备都是支持BLE,这是我们主讲的。
一般情况下现在所说的iOS蓝牙开发也都是BLE开发。我们现在所做的智能家居,智能手环,类似的这些东西基本都是使用的这种方式与iPhone连接的。
二、CoreBluetooth框架简介
1. 两个核心概念
CBCentral :中心设备。一般为主动发起连接的设备就是中心设备。
CBPeripheral :外围设备。比如你用你手机的APP去连接你的智能手环,此时,你的手机叫中心设备,手环就叫外部设备。一般为被连接的设备。又比如,如果是电脑发起连接来连接你的手机,那么此时你的手机就变成了外设,所以说手机可以作为中心设备,也可以作为外部设备。
2. 其他概念
服务:每一个外部设备都会拥有若干个服务,比如说你的智能手环可能会拥有一个管理你心率的服务,还有一个管理你跑步情况的服务。这些服务是你的硬件工程师设定的,作为我们在开发的时候只需要知道有哪些服务就可以了,每一个服务都会有一个唯一的UUID,就是一个字符串,用于辨别区分是哪个服务(外部设备也会有其对应的一个UUID),如果你连接到这个设备的话,你是可以搜索到这些服务的。
特征:每一个服务里边都会有若干个特征,我们就是通过这些特征值来与设备进行交互的,还拿手环的例子来说,比如在它的管理你跑步情况的服务中可能有两个特征值,一个特征是读取手环内你跑步的数据,一个特征是用于你的APP发送数据给这个服务,进行一些设置什么的,同样每个服务中的特征也是由你的硬件工程师设置好的,你只需要用就好了,当然这些特征值也会有其对应的一个唯一的UUID。
特征的属性:这些个特征的属性也是不尽相同有的是用来读数据的,有的是用来订阅通知的,有的是用来发送数据的,这些属性同样也都是设定好的,我们只需要知道哪一个特征是什么属性就好了。这些属性种类有一个枚举:
typedef NS_OPTIONS(NSUInteger, CBCharacteristicProperties) {
CBCharacteristicPropertyBroadcast = 0x01,
CBCharacteristicPropertyRead = 0x02,
CBCharacteristicPropertyWriteWithoutResponse = 0x04,
CBCharacteristicPropertyWrite = 0x08,
CBCharacteristicPropertyNotify = 0x10,
CBCharacteristicPropertyIndicate = 0x20,
CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40,
CBCharacteristicPropertyExtendedProperties = 0x80,
CBCharacteristicPropertyNotifyEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0) = 0x100,
CBCharacteristicPropertyIndicateEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0) = 0x200
};
3. CoreBluetooth框架其实就包含了两种场景:
场景一:手机作为中心设备
场景二:手机作为外围设备
这两种场景分别有一组相应的API和类。如图所示:
如果我们现在要开发一个智能手环,那么我们的手机就充当了中心设备的角色所以将会使用左边的这组类;
反之如果我们要将我们的手机作为外围设备来开发,那么就会使用右边的这组。一般情况下我们使用左边的这组会相应的多一点。
三、CoreBluetooth框架的基本使用流程
1. 中心设备
创建中心设备的对象——>搜索外部设备——>连接目标外部设备——>扫描到外设中的服务——>获取到其中的特征——>通过这些特征于设备做数据的交互——>交互完毕断开连接
2. 外围设备
创建外部设备对象——>设置自己的服务,特征,权限等——>发布广告——>设置订阅以及读写特征的委托方法