BLE协议栈详解

BLE低功耗蓝牙协议栈框架:
协议概述
所谓协议,即将指定的字节按照一定的顺序排列起来,以便他人使用自己的设备时,能通过该协议同其他设备进行通信。协议一特点,就是有固定的帧格式,通过该格式发送,接收者通过解读帧格式,进而得到新息内容;
3 BLE连接过程
3.1 前言
一般通信协议,一类通信是直接发生数据,当设备接送到数据时,直接对数据进行解析,当接受到的数据合法时,即为有效数据,该类型的通信协议,主要用在有线通信协议中,比如Modbus,Can通常采用的即为该类型的通信方式。
另一类通信协议,则需要新建立连接,当双方连接建立成功了方可通信,例如TCP、BLE;BLE协议在需要进行通信时,即需要向外发送广播信号,告诉接收者,即将和它进行通信,接受者接收到广播内容后,确认是与自己通信,于是向广播者发送一响应信息,这样当广播者和接受者都有了对方的身份信息时,即表示双方连接成功。
因此,在连接过程中,必定有相应的广播帧格式。在BLE通信过程中,假设设备A需要连其他设备假设为B,则A需要不断地发送广播信号(此过程一般有一个时间间隔,在没发送广播数据时间内,芯片处于低功耗状态),每发送一次广播包,称之为一次广播事件。
3.2  广播帧格式
前导:
是一个8比特的交替序列
接入地址的第一个比特为0:01010101
接入地址的第一个比特为1:10101010
接入地址:广播帧为固定地址:0x8E89BED6(低字节在前)
广播报文的报头:
包含4bit广播报文类型、2bit保留位、1bit发送地址类型和1bit接收地址类型。
广播报文类型:

3.3 连接过程
所谓设备A和设备B建立蓝牙连接,就是指设备A和设备B两者“同步”成功 ,包括以下步骤:
(1)设备之间的物理信道一致;
(2)设备间建立了共同的时间锚点;
(3)设备间时钟同步成功;
连接建立过程:
(1)设备A发送一个广播包150us后,将打开一段时间射频接受窗口,接收来自设备B的数据包;
(2)设备B接受到设备A的广播包后,将在这段时间内,向设备A发送连接请求;
(3)当设备A接收到来自设备B的连接请求时,将以此作为初始锚点。
(4)150us后,设备B将打开一段时间射频接受窗口,接收来自设备A的数据包;
(5)设备A将在这段时间,向设备B发送连接请求;设备B将根据连接请求中的内容做好连接准备。
————————————————

连接成功后:
(1)设备A将周期性以CI(connection interval)为间隔,向设备B发送数据包,而设备B也将周期性地以CI为间隔打开射频接收窗口以接收设备A的数据包。
(2) 按照蓝牙spec要求,设备B收到设备A数据包150us后,设备B将切换到发送状态,把自己的数据发给设备A;设备A则切换到接收状态,接收从设备B发过来的数据。
(3)由此可见,连接状态下,设备A和设备B的射频发送和接收窗口都是周期性地有计划地开和关,而且开的时间非常短,从而大大减低系统功耗并大大提高系统效率。
————————————————
 

2、BLE低功耗蓝牙核心协议层详解(Bluetooth Core)

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协议栈的场合,用来规范两者之间的通信协议和通信命令等。

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):GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通信

2 Link Layer状态机

Standby状态是初始状态,即不发送数据,也不接收数据。根据上层实体的命令(如位于host软件中GAP),可由其它任何一种状态进入,也可以切换到除Connection状态外的任意一种状态。

Advertising状态是可以通过广播通道发送数据的状态,由Standby状态进入。它广播的数据可以由处于Scanning或者Initiating状态的实体接收。上层实体可通过命令将Advertising状态切换回Standby状态。另外,连接成功后,也可切换为Connection状态。

Scanning状态是可以通过广播通道接收数据的状态,由Standby状态进入。根据Advertiser所广播的数据的类型,有些Scanner还可以主动向Advertiser请求一些额外数据。上层实体可通过命令将Scanning状态切换回Standby状态。

Initiating状态和Scanning状态类似,不过是一种特殊的接收状态,由Standby状态进入,只能接收Advertiser广播的connectable的数据,并在接收到数据后,发送连接请求,以便和Advertiser建立连接。当连接成功后,Initiater和对应的Advertiser都会切换到Connection状态。

Connection状态是和某个实体建立了单独通道的状态,在通道建立之后,由Initiating或者Advertising自动切换而来。通道断开后,会重新回到Standby状态。

通道建立后(通常说“已连接”),处于Connection状态的双方,分别有两种角色Master和Slave:

在BLE中,两种类型的Physical Channel(advertising channel和data channel)统一使用一种packet format,如下:

Preamble(1 octet)  |  Access Address(4 octets)  |  PDU(2 to 257 octets)  |  CRC(3 octets)

作为一个Profile framework,GATT profile提出了如下的层次结构:

由上面图片可知,GATT profile的层次结构依次是:Profile—>Service—>characteristic。

“Profile”是基于GATT所派生出的真正的Profile,位于GATT Profile hierarchy的最顶层,由一个或者多个和某一应用场景有关的Service组成。

一个Service包含一个或者多个Characteristic(特征),也可以通过Include的方式,包含其它Service。

Characteristic则是GATT profile中最基本的数据单位,由一个Properties、一个Value、一个或者多个Descriptor组成。

Characteristic Properties定义了characteristic的Value如何被使用,以及characteristic的Descriptor如何被访问。

Characteristic Value是特征的实际值,例如一个温度特征,其Characteristic Value就是温度值就。

Characteristic Descriptor则保存了一些和Characteristic Value相关的信息(比较抽象,后续文章会根据实例做进一步的理解)。

以上除“Profile”外的每一个定义,Service、Characteristic、Characteristic Properties、Characteristic Value、Characteristic Descriptor等等,都是作为一个Attribute存在的,具备第8章所描述的Attribute的所有特征:Attribute 
Handle、Attribute Types、Attribute Value和AttributePermissions。

 

 

1. GAP(Generic Access Profile)

GAP层是负责连接的,其中包含广播、扫描、连接、断开的过程和参数

1.1 角色
蓝牙设备的角色主要有中心(Central)和外围设备(Peripheral)两种,中心设备向外围设备发起连接。链路层的主机(Master)和从机(Slave)的概念跟中心和外围的概念是对应的。
除了中心和外围之外,还有Observer和Broadcaster角色,Observer一直进行监听,Broadcaster一直进行发送,这两种角色都只广播,不能发起连接或者被连接,这里就不详细说了

1.2 广播
建立连接之前,外围设备每隔一段时间发送一个广播包,让正在扫描的设备知道这是一个可以连接的设备,扫描设备才能对外围设备开始连接,这个广播包的时间间隔叫advertising interval,这个间隔可以在10ms到10.24s之间,间隔的长短会影响建立连接所花时间。
中心要收到广播包之后才能发送连接请求,相应的,外围设备在发送广播包之后会等待连接请求。

蓝牙广播包最多可以包含31字节数据,包含设备名称和一些标志。中心收到广播包之后可以发送Scan Request以请求更多的广播信息,外围设备会回复一个同样是31个字节的Scan Response。
BLE有37个数据信道和3个广播信道,广播包,Scan Request,Scan Response使用广播信道

1.3 扫描
扫描是指中心监听广播包并且发送Scan request。扫描中有两个参数:Scan window(扫描窗口) 和Scan interval(扫描间隔)

1.4 发起连接
中心发起连接的过程类似于扫描的过程,中心收到广播包之后会发送一个连接请求给外围设备

1.5 连接
中心和外围设备连接上之后,中心会按照一定的连接间隔(Connection interval)向外围设备请求数据,这个间隔是由中心定的,在7.5ms到4s之间。



 2. GATT(Generic Attribute profile)

设备之间的数据传输是在GATT这层完成的

2.1 角色
除了GAP里面的角色,BLE在GATT里面也定义了两个角色,分别是GATT Server 和GATT Client,一般来说产生数据的设备是GATT Server,访问数据的设备是GATT Client,一个设备可以既是GATT Server也是GATT Client。这两个角色跟GAP中的角色并没有关系。

2.2 GATT结构
GATT Server通过属性表(Attribute table)来组织数据,

2.2.1 Attribute
上图中每一行就是一个属性Attribute。
每个属性具有一个handle,一个UUID,和一个Value。
Handle是Attribute的一个索引,每个Attribute的Handle都是唯一的。
UUID(universal unique identifier)表示的是Attribute中数据的类型信息。UUID在一个设备里面不是唯一的,可以有多个Attribute的UUID都一样

2.2.2 Characteristic
可以把Characteristic看作是上图中几行的集合(几个Attribute的集合)
每个Characteristic至少有两个Attribute,其中一个是声明,另一个包含数据。前面说过,蓝牙传输数据是通过GATT来传的,更具体的来说,是通过一个个Characteristic来传的。

2.2.3 Descriptors 描述符
Characteristic除了包含声明和数据之外,还可以有描述符(Descriptors,但不是必须有),Descriptors是用来进一步描述Characteristic(但不提供数据)的Attribute,比如说用自然语言描述该Characteristic是用来干什么的。
有一类特殊的描述符,叫CCCD(Client Characteristic Configuration Descriptor),支持Notify和Indicate的Characteristic 必须包含CCCD

2.2.4 Service
Service 是一个或者多个Characteristic的逻辑组合
一个GATT Service 通常包含了一些相关的功能,举例来说,一个人机界面Service包含了各种人机交互输入输出的数据,而其中的每个Characteristic 是一类信号或者设备
介绍几个常见的Service。
GAP GATT Service:作为Central或者Peripheral的BLE设备都需要有这个Service。这个Service包含了如何发现和连接设备的信息
Generic Attribute Service: GATT Server都要有这个Service,这个Service包含了GATT Server的信息

2.2.5 Profile
一个或者多个Service组合在一起称为Profile。Profile 是逻辑上的概念,自己并不具备单独的Attribute。

2.3 标准和自定义的Service和Characteristic
蓝牙联盟定义了一些标准的Profile, Service, Characteristic 和Attribute。由于Profile和Service是在具体应用中规定的,所以用户可以进行自定义

2.4 UUID
图2中每一个Attribute都有UUID,UUID是一个128位的数字,是用来描述Attribute的类型的

2.4.1 蓝牙联盟UUID
蓝牙联盟把UUID分为基础UUID(base UUID)和16位UUID。
蓝牙联盟规定的UUID都具有同样的base UUID:
0x0000xxxx-0000-1000-8000-00805F9B34FB
蓝牙联盟规定了一些16位UUID,替换掉base UUID中的xxxx就组成一个完整的128位UUID了。举例来说,0x2A37是一个16位Heart Rate Measurement Characteristic,那么对应的128位的UUID就是:
0x00002A37-0000-1000-8000-00805F9B34FB。

由于所有蓝牙联盟的UUID都具有同样的base UUID,所以用16位UUID就可以区分蓝牙联盟规定的Attribute了
但我们自定义的Attribute, Characteristic, Service,不能使用这个base UUID,因此也不能用16位UUID,只能使用制造商自定义的128位UUID。

2.5 空中接口操作和属性
由于每个Attribute具有唯一的Handle,所以几乎所有的操作都是通过Handle去完成,Characteristic常用的属性有:Write, Write without response, Read, Notify, Indicate。 Characteristic的属性决定了我们可以如何使用它

Write, Write without response
这两种属性允许GATT Client 对Server的characteristic的值进行写操作,两者的区别是Write without response对写操作不会有确认

Read
GATT Client可以读Server的Characteristic的值。

Notify 和Indicate
这两种属性表示的是当GATT Server 中该Characteristic 的值发生变化的时候会通知Client。两者的区别是Indicate 会进行确认但Notify不会


 

 

 

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/ansen312/p/12719405.html