iOS中用到的框架是CoreBluetooth.framework,主要用于和第三方蓝牙的交互,这个不需要苹果的认证,但是必须是蓝牙4.0以上的设备。蓝牙4.0也叫BLE(Bluetooth Low Energy 蓝牙低功耗)所以一般都称之为BlE开发,从iPhone4s及其以后的设备、从iOS6及其以后的系统都是支持BLE的。所以说IOS的BLE开发其实就是CoreBluetooth.framework这个框架的使用,一般情况下现在所说的IOS蓝牙开发也都是BLE开发。我们现在所做的智能家居,智能手环,类似的这些东西基本都是使用的这种方式与iPhone连接的。
核心概念
CBCentralManager:中心设备(用来连接到外部设备的管家)
CBPeripheralManager:外部设备(第三方的蓝牙4.0设备)
当手机作为中心设备去连接第三方蓝牙设备的时候,首先需要了解下面几个概念
服务:每一个外部设备都会拥有若干个服务,比如说你的智能手环可能会拥有一个管理你心率的服务,还有一个管理你跑步情况的服务。这些服务是你的硬件工程师设定的,作为我们在开发的时候只需要知道有哪些服务就可以了,每一个服务都会有一个唯一的UUID,就是一个字符串,用于辨别区分是哪个服务(外部设备也会有其对应的一个UUID),如果你连接到这个设备的话,你是可以搜索到这些服务的。
特征:每一个服务里边都会有若干个特征,我们就是通过这些特征值来与设备进行交互的,还拿手环的例子来说,比如在它的管理你跑步情况的服务中可能有两个特征值,一个特征是读取手环内你跑步的数据,一个特征是用于你的APP发送数据给这个服务,进行一些设置什么的,同样每个服务中的特征也是由你的硬件工程师设置好的,你只需要用就好了,当然这些特征值也会有其对应的一个唯一的UUID。
特征的属性:这些个特征的属性也是不尽相同有的是用来读数据的,有的是用来订阅通知的,有的是用来发送数据的,这些属性同样也都是设定好的,我们只需要知道哪一个特征是什么属性就好了。这些属性种类有一个枚举:
也就是说每个外设下面有多个服务,每个服务下面有多个特征,我们和外设交互数据通过特征进行读、写、通知的;
蓝牙中心模式流程如下:
- 建立中心角色
- 扫描外设(discover)
- 连接外设(connect)
- 扫描外设中的服务和特征(discover)
- 4.1 获取外设的services
- 4.2 获取外设的Characteristics,获取Characteristics的值,获取Characteristics的Descriptor和Descriptor的值
- 与外设做数据交互(explore and interact)
- 订阅Characteristic的通知
- 断开连接(disconnect)
特征属性
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
};