基于蓝牙4.0(btle)的简单通讯流程

  • 时间:2017-06-20
  • 分类:IOS开发
  • 2514 人浏览
[导读]在iOS10以后,需要在 Info.plist 文件里面设置 NSBluetoothPeripheralUsageDescription 字段,添加访问蓝牙权限的描述,否则程序会崩溃,且上传程序是会被拒的。

基于蓝牙4.0进行通讯,以手机为CentralManager,简单串一下通讯流程如下:

在iOS10以后,需要在 Info.plist 文件里面设置 NSBluetoothPeripheralUsageDescription 字段,添加访问蓝牙权限的描述,否则程序会崩溃,且上传程序是会被拒的。

1、扫描 (1)初始化一个CentralManager

CBCentralManager 的创建是异步的,如果初始化完成之后没有被当前创建它的类所持有,控制台会报错(说白了如果是局部变量就会在控制台报错)
btle[3800:1288058] [CoreBluetooth] XPC connection invalid

queue:指明在哪个队列处理事件,为nil时表示在主线程处理 options:这个字典有俩个官方的key
CBCentralManagerOptionShowPowerAlertKey:提示蓝牙开关未打开时会弹出警告框
CBCentralManagerOptionRestoreIdentifierKey:一个指定中央管理器的uid(和蓝牙程序进入后台有关,没有多做研究)
(2)监听CentralManager蓝牙状态

当创建CentralManager成功后,系统就会回调CBCentralManagerDelegate的代理方法

(3)开始扫描

只有当蓝牙状态为CBManagerStatePoweredOn的时候,才可以扫描周边设备,否则控制台报错
btle[3815:1292851] [CoreBluetooth] API MISUSE: <CBCentralManager: 0x174263380> can only accept this command while in the powered on state

serviceUUIDs:为nil时,会扫描正在广播的所有Peripheral。如果你指定某个Service或者一组Service,只能扫描提供这些Service的Peripheral。(Service里面放的是CBUUID) options:这个字典有俩个官方的key
CBCentralManagerScanOptionAllowDuplicatesKey:为NO,表示不会重复扫描已经发现的设备。为YES,扫描中会出现已经扫到的设备。默认为NO
CBCentralManagerScanOptionSolicitedServiceUUIDsKey:以一个数组的形式存在,指定这个选项后central便会找指定的服务的CBUUID
(3)扫描成功

每当扫描到一个外设,系统就会回调CBCentralManagerDelegate的代理方法

连接 (1)设备连接

当系统扫描到的peripheral进行连接,成功与失败都会有相应的回调方法响应,没有连接超时的回调,苹果官方文档说明,只有连接失败

peripheral:将要连接的peripheral,需要保持一下peripheral options:这个字典有俩个官方的key
这些key值和蓝牙后台有关,没有多做研究
CBConnectPeripheralOptionNotifyOnConnectionKey
CBConnectPeripheralOptionNotifyOnDisconnectionKey
CBConnectPeripheralOptionNotifyOnNotificationKey
(2)当设备连接成功

当你调用设备连接的时候,成功就会回调CBCentralManagerDelegate的代理方法,这里我们需要去发现CBPeripheral的一些相关服务

(3)设备连接失败

当你调用设备连接的时候,失败就会回调CBCentralManagerDelegate的代理方法,可以再次连接外设

(4)设备断开

当你调用设备连接成功后,又断开的时候就会回调CBCentralManagerDelegate的代理方法

发现服务 (1)发现CBPeripheral的Services

当CBPeripheral连接成功后,需要设置CBPeripheralDelegate代理方法去发现CBPeripheral的相关服务

serviceUUIDs:可以添加一组CBUUID的service,这样就可以发现指定的Services(官方推荐),如果为nil,则去发现所有有效的Services(相对较慢,不推荐) (2)发现Services成功

成功发现Services,就会回调CBPeripheralDelegate的代理方法,需要通过peripheral的services属性去获取发现的CBService。同时,我们需要在此去发现每一个CBService下的characteristics

发现特征 (1)发现Characteristics

characteristicUUIDs:可以添加一组CBService的characteristic,这样就可以发现指定的characteristic(官方推荐),如果为nil,则去发现所有有效的characteristic(相对较慢,不推荐) service:被发现Characteristics的CBService (2)发现Characteristics成功

成功发现Characteristics就会回调CBPeripheralDelegate的代理方法,通常会有两中characteristics:CBCharacteristicPropertyRead和CBCharacteristicPropertyWrite。

(3)写使能

对于Characteristic是CBCharacteristicPropertyNotify的写使能,就会回调CBPeripheralDelegate的代理方法

(4)判断使能是否写成功

(5)从Peripheral读取数据

对于Characteristic是CBCharacteristicPropertyRead的写使能,就会回调CBPeripheralDelegate的代理方法

实现通讯 (1)写入数据

写入数据时,当你把type设置为CBCharacteristicWriteWithResponse,就会回调CBPeripheralDelegate的代理方法,如果为CBCharacteristicWriteWithoutResponse则不会

(2)写入成功

(3)接收数据

当你写入成功数据成功之后,CBPeripheral收到后若有返回的数据则继续会出现在(5)从Peripheral读取数据中,以此返回进行通信。。。。

来源:本文为线上采编,如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除!