1. 协议栈结构图:
1.1 控制器
1.2 主机
1.3 补充资料:
1、物理层(Physical Layer,简写 PHY):
PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。是1Mbps自适应跳频的GFSK射频,工作于免许可证的2.4GHz ISM(工业、科学与医疗)频段。PHY层做得好不好,直接决定整个BLE芯片的功耗,灵敏度以及selectivity等射频指标。
负责提供数据传输的物理通道(通常称为信道),也即频段
2、链路层(Link Layer,简写 LL):
LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点。LL层要做的事情非常多,比如具体选择哪程度的射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。LL层只负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP或者ATT。
物理层定义比喻为路,此时路是没有逻辑的,没有直行道,快速道,左右转车道,而链路层的功能就是定义逻辑链路,按照传输类型划分。
3.主机控制接口层(Host Controller Interface,简写 HCI):
HCI是可选的,HCI主要用于2颗芯片实现BLE协议栈的场合,用来规范两者之间的通信协议和通信命令等。
为主机与控制器提供标准通讯接口,这一层可以是软件API或硬件外设UART SPI USB
4、通用访问配置文件层(Generic access profile,简写GAP):
GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。
5,逻辑链路控制及自适应协议层(Logical Link Control and Adaptation Protocol,简写 L2CAP):
L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
6、安全管理层(Security Manager,简写 SM):
SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。
7、属性协议层(Attribute protocol,简写 ATT):
简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。BLE协议栈中,开发者接触最多的就是ATT。BLE引入了attribute概念,用来描述一条一条的数据。Attribute除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT层。
8、通用属性配置文件层(Generic Attribute profile,简写 GATT):
现在低功耗蓝牙(BLE)连接都是建立在GATT(Generic Attribute Profile)协议之上。GATT是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。
GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。
最重要最贴近开发的层,因为设备数据的通信是通过GATT层实现。从GATT的角度,两个设备建立连接后,一个为GATT服务器,一个为GATT客户端。
一个GATT服务器中可包含一个或多个GATT服务,从而引出”服务“这个概念。 假设一个设备是温度采集器,明显温度采集器的相关参数跟设备参数不属于同一类,因此该层应同时支持多个服务。多个服务如何区分?这即对应蓝牙联盟规范的UUID,有自定义UUID以及蓝牙联盟定义的UUID。
而一个服务具体可以表现为多个特性去实现,特性也用不同的UUID区分。 特性可以理解为程序里面的变量,变量必须有变量类型与变量的值。对应特性,特性在蓝牙联盟里包括三个要素:声明、数值和描述。前两者是必须的。
综上,GATT层有着多个“服务”,一个“**服务”**包括多个“特性”,而特性怎么存储,怎么被实实在在的获取?在协议栈中,特性和服务作为属性存在属性表(某个多维数组)中,所以无论是服务还是特性,均是一条条属性!所以GATT层是属性协议。而属性表是怎么样的呢?
属性:指一条带有标签的可以被寻址的数据,有句柄、属性类型、属性值组成。 被寻址也即被找到,通过句柄找到,句柄就是该属性在属性表的位置,也即程序里数组的下标。属性类型是真实存在的,蓝牙联盟规定128位的UUID来表征一个具体的属性。由于BLE的GATT可以认为是蓝牙标准规范的精简版,所以BLE被允许只传输前面2字节(16位)的UUID,所有的BLE的UUID的基数都是一样的,如下,只有前面两字节不同。属性值的长度可以最长到512字节,但对于某些属性,其长度是固定的。对于蓝牙标准里面规定的UUID所对应的属性(包括服务、特性定义、特性值、特性描述等等),服务、特性定义的长度是确定的,而特性值则是不固定长度的。
没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境, 成了出货量最大的2.4G无线通信产品。
2. GAP(General Access profile)
3. GATT(Generic Attribute profile)
更详细的图:
Profile :Profile并不是实际存在于BLE外设上的,它只是一个被Bluetooth SIG或者外设设计者预先定义的Service的集合。例如心率Profile(Heart Rate Profile)就是结合了Heart Rate Service和Device Information Sercvice。所有官方通过GATT Profile的列表可以从这里找到。
Service: Service是把数据分成一个个的独立逻辑项,它包含一个或者多个Characteristic。每个Service有一个UUID唯一标识。UUID有16bit的,或者128bit的。16bit的UUID是官方通过认证的,需要花钱购买,128bit是自定义的,这个就可以自己随便设置。
官方通过了一些标准Service,完整列表在这里。以Heart Rate Service为例,可以看到它的官方通过16bitUUID是0x180D,包含3个Characteristic:Heart Rate Measurement,Body Sensor Location和Heart Control Point,并且定义了只有一个第一个必须的,它是可选实现的。
Characteristic :在GATT事务中的最低界别的是Characteristic,Characteristic是最小的逻辑数据单元,当然它可能包含一个组关联的数据,例如加速度计的X/Y/Z三轴值。
Characteristic可以理解为一个数据类型,它包括一个value和0至多个对次value的描述(Descriptor)。
Descriptor对Characteristic的描述,例如范围、计量单位等。
参考:Android4.3 蓝牙BLE初步
与Service类似,每个Characteristic用16bit或者128bit的UUID唯一标识。你可以免费使用Bluetooth SIG官方定义的标准Characteristic,使用官方定义的,可以确保BLE的软件和硬件能相互理解。当然,你可以自定义Characteristic,这样的话,就只有你自己的软件和外设能够相互理解。
举个例子,Heart Rate Measurement Characteristic,这是上面提到的Heart Rate Service必需实现的Characteristic,它的UUID是0x2A37。它的数据结构是,开始8bit定义心率数据格式(是UINT8还是UINT16?),接下来就是对应格式的实际心率数据。
实际上,和BLE外设打交道,主要是通过Characteristic。你可以从Characteristic读取数据,也可以往Characteristic写数据。这样就实现了双向的通信。所以你可以自己实现一个类似串口(UART)的service,这个Service中包含两个Characteristic,一个被配置只读的通道(RX),另一个配置为只写的通道(TX)。
GATT调用下层的ATT,ATT的attirbute在GATT中表现为Characteristic。
参考资料: