赞
踩
因最近面试,总有人问到BLE协议栈,据此,记录学习BLE协议栈的过程。
所谓协议,即将指定的字节按照一定的顺序排列起来,以便他人使用自己的设备时,能通过该协议同其他设备进行通信。协议一特点,就是有固定的帧格式,通过该格式发送,接收者通过解读帧格式,进而得到信息内容;
3.1 前言
一般通信协议,一类通信是直接发生数据,当设备接送到数据时,直接对数据进行解析,当接受到的数据合法时,即为有效数据,该类型的通信协议,主要用在有线通信协议中,比如Modbus,Can通常采用的即为该类型的通信方式。
另一类通信协议,则需要新建立连接,当双方连接建立成功了方可通信,例如TCP、BLE;BLE协议在需要进行通信时,即需要向外发送广播信号,告诉接收者,即将和它进行通信,接受者接收到广播内容后,确认是与自己通信,于是向广播者发送一响应信息,这样当广播者和接受者都有了对方的身份信息时,即表示双方连接成功。
因此,在连接过程中,必定有相应的广播帧格式。在BLE通信过程中,假设设备A需要连其他设备假设为B,则A需要不断地发送广播信号(此过程一般有一个时间间隔,在没发送广播数据时间内,芯片处于低功耗状态),每发送一次广播包,称之为一次广播事件。
3.2 广播帧格式
前导:
是一个8比特的交替序列
接入地址的第一个比特为0:01010101
接入地址的第一个比特为1:10101010
接入地址:广播帧为固定地址:0x8E89BED6(低字节在前)
广播报文的报头:
包含4bit广播报文类型、2bit保留位、1bit发送地址类型和1bit接收地址类型。
广播报文类型:
发送地址类型:
0: 公共地址
1: 随机地址
长度:广播报文的长度域包含8个比特,有效值的范围是6~37
数据: 广播者地址(6个字节)+广播数据(31个字节)
校验: 3个字节,为CRC校验。
广播数据: 分为有效数据和无效数据
有效数据部分:
包含N个AD Structure,每个AD Structure由Length,AD Type和AD Data组成。 其中:
Length: AD Type和AD Data的长度。
AD Type: 指示AD Data数据的含义。详见https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile/
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的射频发送和接收窗口都是周期性地有计划地开和关,而且开的时间非常短,从而大大减低系统功耗并大大提高系统效率。
3.4 数据帧格式
连接成功后,双方将可以互相发送数据,那么将涉及到其数据帧格式:
字段释义:
LLID:表示此包数据是 LL Date PDU 还是 LL Control PDU
00b: Reserved
01b: LL Date PDU: Continuation fragment of L2CAP message, or an Empty PDU.
10b: LL Date PDU: Start of an L2CAP message or a complete L2CAP message with
no fragmentation.
11b: LL Control PDU
MIC( Message Integrity Check):信息完整性检测。涉及到加密操作,上图中是用虚线表示的,并不是一定要有此项。
MD:这个标志位是用来通知对方设备自己还有其他数据准备发送。 0 表示没有更多数据发送, 1 表示有更多数据准备发送。这样,只要还有数据需要发送,连接事件会自动扩展。一旦不再有数据发送,连接事件立即关闭。
Note: 如何区分是确定包、新包还是重发包?
SN:只有一个 bit 位,所以值是在 0 和 1 之间进行切换。如果序列号与之前的一样,则为重传报文,如果序列号和之间的不同,则为新报文。
NESN:预期序列号,它是接收方希望接到的下一包的序列号,也就是数据包的确认标志。 当设备接收到序列(SN)为 0 的报文后,在发送给对方的数据包中,应将 NESN 设为 1,这样对方接收到这个包后,会发送一个新的数据包过来,否则就会重发上一次序列号为 0 的包。这个标志可以用来判断数据包是否被正确接收还是需要重传。
BLE协议栈的框架如下图所示:
PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。
LL层是整个BLE协议栈的核心,执行一些基带协议,底层的数据包管理协议。
主机控制接口层
GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。
L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。