1. 简介
1.1 蓝牙发展历程
蓝牙,直接来自于一位国王的名字--King Harald ‘Bluetooth' Gromsson。这位国王因两件事留名于史,其一是在公园958年统一了丹麦和挪威,其二是在其死后,其牙齿呈现出暗蓝色的颜色,因而得名蓝牙为绰号。而蓝牙联盟之所以选择它作为联盟的名字,则是看中了King Harald在统一丹麦和挪威上的贡献。联盟希望,该技术能够像他一样,将PC和无线产业用短距离无线传输连接在一起。
人们日常使用的蓝牙,是在1996年由英特尔、爱立信和诺基亚共同发起而成立的联盟,意在为短距离无线传输制定标准,低功耗、低成本的无线通信连接的方法,以支持不同产品和行业之间的连通与协作
- 第一代蓝牙主要是指90年代的V1.0~V1.2版本,是关于段距离通信的早期探索,此时还存在许多问题,应用不是特别广泛
- 第二代蓝牙主要是00年中V2.0~V2.1版本,新增了EDR(Enhanced Data Rate)技术提高传输速率,以及体验及安全
- 第三代蓝牙主要是00年末V3.0版本,新增了802.11 WiFi协议,引入了AMP(Generic Alternate MAC/PHY)交替射频技术,极大的提高了传输速率并降低功耗
- 第四代蓝牙是10年以来的V4.0~V4.2版本,主推LE(Low Energy)低功耗,大约仅消耗十分之一,将三种规格,包括经典蓝牙、高速蓝牙、和蓝牙低功耗,集中在一起形成一套综合协议规范
- 第五代蓝牙是16年开始提出的V5.0版本,主要是为了支持物联网,在功耗、传输速率、有效传输距离、数据包容量方面都做了极大的提升
1.2 蓝牙技术概述
蓝牙分为经典蓝牙(BT-Bluetooth)和低功耗蓝牙(BLE-Bluetooth Low Energy)。这两套原理和实现都不一样,也无法实现互通。
Basic Rate(BR)/AMP
最初的蓝牙技术,包括可选的EDR(Enhanced Data Rate)技术和交替使用的MAC层和PHY层扩展 AMP(Alternate MAC and PHY layer extension)【优化传输速度的过程】
蓝牙诞生之初使用的BR技术,传输速率很低,随着发展而变得无法支持,所以引入了EDR,这时还没有修改软硬件架构,但是之后又落伍了,所以直接引入了WiFi的底层协议,也就是MAC/PHY扩展,但这部分的实现就无法直接更替,所以BR/EDR只能与AMP交替使用。
经典蓝牙主要用于数据量较大的传输,如蓝牙耳机/音箱等
Low Energy(LE)
蓝牙低功耗,则不关心传输速率,而是从降低功耗的角度实现的另一套技术,跟前面的协议没有丝毫关系。
BLE分了很多个版本,现在用的比较多的就是4.2和5.X。那4.2到5.0之间有哪些升级呢?首先,4.2版本传输速度只有1Mbps,广播包最大长度为31字节。而5.0版本开始,传输速度就已经增加到2Mbps了,并且广播包的最大长度也增加为254字节。除此之外,5.X版本还增加了Mesh的功能,且通讯距离也增加至300米以上。
2. 蓝牙架构
蓝牙协议将蓝牙整体分成了两层架构,底层是核心协议,描述了蓝牙核心技术的基础和规范,应用层协议则基于具体需求,使用核心协议提供的机制,实现不同的功能策略
核心协议包含两部分,Host和Controller,这两部分在不同的蓝牙协议版本中略有区别,但大致上是,Controller完成硬件侧的规范制订,包括信号调制解调,会抽象出用于通信的逻辑链路,可能存在一个或多个,如LE Controller、BR/EDR Controller;Host则在逻辑链路的基础上完成更友好的封装,屏蔽掉技术细节,方便应用层对数据的使用。
2.1 蓝牙协议
2.1.1 应用层
应用层(App Layer)为不同场景定义规范,提出Profile(一项服务)的概念,实现各种应用功能
2.1.2 主协议层
L2CAP(Logical Link Control and Adaptation Protocol Layer)
L2CAP对LL进行了一次简单的封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
- 逻辑链路控制和适配协议,负责管理逻辑链路,使得不同应用可共享一个逻辑链路,类似端口的实现
- 在逻辑链路的基础上,抽象出与具体技术无关的数据传输信道,如单/广播,然后对上以L2CAP channel endpoints的概念,为不同应用程序提供独立的传输通道
- 逻辑控制和适配协议的工作就是实现逻辑信道的多路复用(multiplexing),对上层数据进行分割和重组,以及后续的流控、错误控制和重传等
- 多路复用思想:将要发送的数据分割成一个个数据包(Packet Data Unit,PDU),添加包含特定ID的头部,接收方解析头部ID进行重组
- 多路复用实现
- 基于连接:L2CAP会为每个逻辑信道分配一个编号(Channel ID,CID),有些CID会有固定用途.
GAP层(Generic access profile-通用访问配置文件)
GAP是对LL层payload(有效数据包)如何进行解析的两种方式的一种,而且也是最简单的一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接。
- 通用访问配置文件,定义了蓝牙设备的通用的访问功能,与GATT的数据通信过程对应,处理无连接及连接建立过程的通信,也就是为广播、扫描、发起连接这些过程定义统一规范
- 定义了用户接口的基本参数,包括蓝牙地址、名称、pincode、class等概念
- 定义了设备的角色:
- Broadcaster Role:正在发送advertising events的设备
- Observer Role:正在接收advertising events的设备
- Peripheral Role:接受Link Layer连接的设备(对应Link Layer的slave角色)
- Central Role,发起Link Layer连接的设备(对应Link Layer的master角色)
- 定义了通信的过程和操作模式:
- Broadcast mode and observation procedure:实现单向的、无连接的通信
- Discovery modes and procedures:实现蓝牙设备的发现操作
- Connection modes and procedures:实现蓝牙设备的连接操作
- Bonding modes and procedures:实现蓝牙设备的配对操作
SMP(Secure manager protocol-加密管理协议)
SMP用来管理BLE连接的加密和安全。如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。
ATT(Attribute protocol-属性协议)
简单来说,ATT层用来定义用户命令及命令操作的数据。比如读取某个数据或者写某个数据。BLE协议栈中,开发者接触最多的就是ATT。BLE引入了attribute概念,用来描述一条一条的数据。Attrubute除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT层。
- 属性协议主要是针对物联网场景,核心思想就是将采集的信息或控制的命令以属性的形式抽象出来,提供接口供远端设备读写
- 采用C/S形式,信息提供方为ATT Server,如传感器,访问方为ATT Client
- 为每个Attribute定义了三个属性
- Type,即Attribute的类型,使用UUID区分
- Handle,服务端用来唯一标识Attribute的16-bit数值
- Value,Attribute的值
- 为每个Attribute定义了一系列权限,方便服务端控制客户端的行为,包括访问/加密/认证/授权
- 对于不同的Attribute,客户端对服务端的访问方式也不一样,包括Find/Read/Write
- 传输过程是在L2CAP的基础上,使用基于通道的多路复用,CID为0x0004
GATT(Generic attribute profile-通用属性配置文件)
GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑。但互联互通就会出问题,也正是因为有了GATT和各种各样的