iOS蓝牙协议
背景
- 在iOS开发过程中,在与一些硬件设备通信时,不可避免的要使用蓝牙,开发使用CoreBluetooch框架,BLE蓝牙4.0,那么蓝牙是怎么通信的呢?
- 目前所有的 BLE 应用都基于 GATT建立连接,两个BLE设备,通过 Service 和 Characteristic 进行通信
认识
- MFi:make for ipad ,iphone, itouch 专们为苹果设备制作的设备,开发使用 ExternalAccessory 框架。认证流程挺复杂的,而且对公司的资质要求较高,无限制。
- BLE:buletouch low energy,蓝牙 4.0 设备因为低耗电,所以也叫做 BLE,开发使用 CoreBluetooth 框架。
- GATT Profile(Generic Attribute Profile):GATT 配置文件是一个通用规范,用于在 BLE 链路上发送和接收被称为 “属性”(Attribute)的数据块。目前所有的 BLE 应用都基于 GATT。
1,定义两个 BLE 设备通过叫做 Service 和 Characteristic 的东西进行通信。中心设备和外设需要双向通信的话,唯一的方式就是建立 GATT 连接。
2,GATT 连接是独占的。基于 GATT 连接的方式的,只能是一个外设连接一个中心设备。
3,配置文件是设备如何在特定的应用程序中工作的规格说明,一个设备可以实现多个配置文件。 - GAP(Generic Access Profile):用来控制设备连接和广播,GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。
1,GATT 连接,必需先经过 GAP 协议。
2,GAP 给设备定义了若干角色,主要两个:外围设备(Peripheral)和中心设备(Central)。
3,在 GAP 中外围设备通过两种方式向外广播数据:Advertising Data Payload(广播数据)和 Scan Response Data Payload(扫描回复)。 - Profile:并不是实际存在于 BLE 外设上的,它只是一个被 Bluetooth SIG(一个以制定蓝牙规范,以推动蓝牙技术为宗旨的跨国组织)或者外设设计者预先定义的 Service 的集合。
- Service:服务,是把数据分成一个个的独立逻辑项,它包含一个或者多个 Characteristic。每个 Service 有一个 UUID 唯一标识。UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通过认证的,需要花钱购买,128 bit 是自定义的,可以自己设置。每个外设会有很多服务,每个服务中包含很多字段,这些字段的权限一般分为读 read,写 write,通知 notiy 几种,就是我们连接设备后具体需要操作的内容。
- Characteristic:特征,GATT 事务中的最低界别,Characteristic 是最小的逻辑数据单元,当然它可能包含一个组关联的数据,例如加速度计的 X/Y/Z 三轴值。与 Service 类似,每个 Characteristic 用 16 bit 或者 128 bit 的 UUID 唯一标识。每个设备会提供服务和特征,类似于服务端的 API,但是机构不同。
- Description:每个 Characteristic 可以对应一个或多个 Description 用户描述 Characteristic 的信息或属性。
- Central、Peripheral:中心设备和外围设备,发起连接的是 Central,被连接的设备为 Peripheral。
案例
通信准备
以一个大厂蓝牙门锁项目为例:
- 首先要分清那个是中心设备,哪个是外围设备,这取决于通信需求,对于iOS门锁项目来说,iOS的App是作为contral需要数据,门锁是作为peripheral外围设备 提供数据
- 然后peripheral就是不断发送广播,希望被central中心设备找到,广播信息中包含设备名字,设备信号强度等等,如果是温度调节器,广播信息中就包含当前设备温度
- 然后central中心设备的作用则是去扫描寻找,找到需要连接的peripheral
- 当central与需要连接的peripheral成功连接,便可获取peripheral提供的所有service服务和characteristic特征。通过对characteristic的数据进行读写,便可以实现central与peripheral的通信
- 作为 peripheral,那么它提供的主要方法则是对 service 的管理,同时还兼备着向 central 广播数据的功能。peripheral 同样会对 central 的读写要求做出相应。
通信流程
- 中心模式(CBCentralManager)流程:
1、建立中心角色
2、扫描外设(discover)
3、连接外设(connect)
4、扫描外设中的服务和特征(discover)
4.1 获取外设的 services
4.2 获取外设的 Characteristics,获取 Characteristics 的值,获取 Characteristics 的 Descriptor 和 Descriptor 的值
5、与外设做数据交互(explore and interact)
6、订阅 Characteristic 的通知
7、断开连接(disconnect) - 外设模式(CBPeripheralManager)流程:
1、启动一个 Peripheral 管理对象
2、设置本地 Peripheral 服务、特性、描述、权限等等
3、设置 Peripheral 发送广播
4、设置处理订阅、取消订阅、读 characteristic、写 characteristic 的委托方法
中心模式的使用
中心模式的应用场景:主设备(手机去扫描连接外设,发现外设服务和属性,操作服务和属性的应用。一般来说,外设(蓝牙设备,比如智能手环之类的东西)会由硬件工程师开发好,并定义好设备提供的服务,每个服务对于的特征,每个特征的属性(只读,只写,通知等等)。
蓝牙程序需要使用真机调试。
4.1 App 连接外设的实现
- 1、建立中心角色
导入 CoreBluetooth 头文件,建立中心设备管理类,设置主设备委托。 - 2、扫描外设(discover)
1,扫描外设的方法需要放在 centralManager 成功打开的代理方法 - (void)centralManagerDidUpdateState:(CBCentralManager *)central 中,因为只有设备成功打开,才能开始扫描,否则会报错。
2,扫描到外设后会进入代理方法 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI;中。 - 3、连接外设(connect)
1,对要连接的设备需要进行强引用,否则会报错。
2,一个主设备最多能连 7 个外设,每个外设最多只能给一个主设备连接,连接成功,失败,断开会进入各自的代理方法中。 - 4、扫描外设中的服务和特征(discover)
设备连接成功后,就可以扫描设备的服务了,同样是通过委托形式,扫描到结果后会进入委托方法。但是这个委托已经不再是主设备的委托(CBCentralManagerDelegate)&#x