iOS蓝牙协议
背景
认识
案例
通信准备
通信流程
中心模式的使用
4.1 App 连接外设的实现
4.2 作为 Central 时的数据读写
4.2.1 初始化 CBCentralManager
4.2.2 搜索当前可用的 peripheral
4.2.3 连接 peripheral
4.2.4搜索 peripheral 的 service
4.2.5 搜索 service 的 characteristic
4.2.6 读取 characteristic 数据
4.2.7 订阅 Characteristic 数据
4.2.8 向 characteristic 写数据
4.3 数据读写 - 知识补充
4.3.1 CBUUID
4.3.2 设备唯一标识符
4.3.3 检查设备是否能作为 central
4.3.4 检查 characteristic 访问权限
4.3.5 写入后是否回调
4.4 数据读写 - 最佳实践
4.4.1 只扫描你需要的 peripheral
4.4.2 只在必要的时候设置 CBCentralManagerScanOptionAllowDuplicatesKey
4.4.3 正确的搜索 service 与 characteristic
4.4.4 接收 characteristic 数据
4.4.5 适时断开连接
4.4.6 再次连接 peripheral
4.4.7 自动连接
4.4.8 连接超时
4.4.9 蓝牙名称更新
4.5 数据读写 - OTA 固件升级与文件传输
背景
在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
3、连接外设(connect) 1,对要连接的设备需要进行强引用,否则会报错。 2,一个主设备最多能连 7 个外设,每个外设最多只能给一个主设备连接,连接成功,失败,断开会进入各自的代理方法中。
4、扫描外设中的服务和特征(discover) 设备连接成功后,就可以扫描设备的服务了,同样是通过委托形式,扫描到结果后会进入委托方法。但是这个委托已经不再是主设备的委托(CBCentralManagerDelegate),而是外设的委托(CBPeripheralDelegate),这个委托包含了主设备与外设交互的许多回调方法,包括获取 services,获取 characteristics,获取 characteristics 的值,获取 characteristics 的 Descriptor,和 Descriptor的值,写数据,读 RSSI,用通知的方式订阅数据等等。
5、 把数据写到 Characteristic 中
6、订阅 Characteristic 的通知
7、断开连接(disconnect)
4.2 作为 Central 时的数据读写