iOS蓝牙开发
蓝牙协议也是通信协议的一种,目的就是把复杂的问题简单化,任何通信协议都具有层次性,特点如下:
1、从下到上分层,通过层层封装,每一层只需要关心特定的、独立的功能,易于实现和维护
2、在通信实体内部,下层向上层提供服务,上层是下层的用户。
3、在通信实体之间,协议仅针对每一层。实体间的通信,就像每一层之间的通信一样,这样有利于交流、理解、标准化。
当前的蓝牙协议包括BR/EDR(Basic Rate/Enhanced Data Rate)、AMP(Alternate MAC/PHYs)、LE(Low Energy)三种技术。
目前移动设备上适用的蓝牙大多是V4.0以上,经典V4.0是传统的3.0蓝牙升级而成,向下兼容。而BLE4.0 是新的分支,不向下兼容。
经典蓝牙模块,一般用于数量比较大的传输:如语音、音乐等较高数据量传输。经典蓝牙模块可细分为传统蓝牙模块和高速蓝牙模块。
低功耗蓝牙模块是指支持蓝牙协议4.0或更高的模块,特点是成本和功耗的降低,应用于实时性要求比较高的产品中。
1.关于服务与特征值的简述
之前说到蓝牙的连接过程,那蓝牙连接之后具体是如何传数据的呢。这里做一下简要说明。
蓝牙4.0是以参数来进行数据传输的,即服务端定好一个参数,客户端可以对这个参数进行读,写,通知等操作,这个东西我们称之为特征值(characteristic),
但一个参数不够我们用,比如我们这个特征值是电量的值,另一个特征值是设备读取的温度值。
那这时候会有多个特征值,并且我们还会对它们分类,分出来的类我们称之为服务(service)。
一个设备可以有多个服务,每一个服务可以包含多个特征值。为了方便操作,每个特征值都有他的属性,例如长度(size),权限(permission),值(value),描述(descriptor)
【定义场景】
1: 广播端:服务端定义,用于被多台扫描设备同时识别并订阅;
2: 扫描端:客服端定义,用于扫描并订阅广播端设备
开始广播功能:
【第一步、开启广播】
(1): 涉及的类
1: CBPeripheralManager;
外设管理器,管理设备广播状态。
2: CBUUID;
唯一标识,设备的服务,特性和特征描述符。
3: CBMutableService;
外设管理器的服务,用于设定服务特征。
4: CBMutableCharacteristic;
服务的特征,用于设定特征描述。
5: CBMutableDescriptor;
特征的描述。
(2): 类调用时序图
1:CBPeripheralManager初始化外设管理器
2:CBMutableDescriptor 初始化外特征描述
3:CBMutableCharacteristic初始化服务中的特征
4:CBMutableService初始化服务
5:CBPeripheralManager添加服务
(3): CoreBluetooth 原生函数
1: 蓝牙创建,用于权限判断:
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral;
2: 外设管理器添加服务完成,回调结果:
- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error;
3: 广播开启完成,回调结果:
-(void)peripheralManagerDidStartAdvertising: (CBPeripheralManager *)peripheral error:(NSError *)error;
蓝牙的基本操作流程
最主要是用UUID来确定你要干的事情,特征和服务的UUID都是外设定义好的。我们只需要读取,确定你要读取什么的时候,就去判断UUID是否相符。 一般来说我们使用的iPhone都是做centralManager的,蓝牙模块是peripheral的,所以我们是want datas,需要接受数据。
亲测同一设备的UUID对于每台iPhone设备都不一样
1.判断状态为powerOn,然后执行扫描
2.停止扫描,连接外设
3.连接成功,寻找服务
4.在服务里寻找特征
5.为特征添加通知
5.通知添加成功,那么就可以实时的读取value[也就是说只要外设发送数据[一般外设的频率为10Hz],代理就会调用此方法]。
6.处理接收到的value,[hex值,得转换] 之后就自由发挥了,在这期间都是通过代理来实现的,也就是说你只需要处理你想要做的事情,代理会帮你调用方法。[别忘了添加代理]