BLE入门总结
经典蓝牙与低功耗蓝牙对比
BLE的特点
-
低成本、低功耗
- 低功耗设计:蓝牙4.0版本强化了蓝牙在数据传输上的低功耗性能,功耗较传统蓝牙降低了90%。
- 传统蓝牙设备的待机耗电量一直是其缺陷之一,这与传统蓝牙技术采用16——32个频道进行广播有很大关系,而低功耗蓝牙仅适用3个广播通道,且每次广播时射频的开启时间也有传统的22.5ms减少到0.6~1.2ms,这两个协议规范的改变,大幅降低了因为广播数据导致的待机功耗。
-
快速启动、瞬间连接
- 此前蓝牙版本的启动速度非常缓慢,2.1版本的蓝牙启动连接需要6s时间,而蓝牙4.0版本仅需要3ms即可完成,几乎是瞬间连接。
-
传输距离极大提供
协议栈结构
概念
-
PHY层(Physical layer物理层)。PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。
-
LL层(Link Layer链路层)。LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点。LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。LL层只负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP或者GATT。
-
HCI(Host controller interface)。HCI是可选的(具体请参考文章: 三种蓝牙架构实现方案(蓝牙协议栈方案)),HCI主要用于2颗芯片实现BLE协议栈的场合,用来规范两者之间的通信协议和通信命令等。
-
L2CAP层(Logic link control and adaptation protocol)。L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
-
ATT(Attribute protocol)。ATT层用来定义用户命令及命令操作的数据。
-
GATT(Generic attribute profile )。GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。
-
SMP(Secure manager protocol)。SMP用来管理BLE连接的加密和安全的。
-
GAP层(Generic access profile)。GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义。GAP目前主要用来进行广播,扫描和发起连接等。
- 以下开始从嵌入式上层应用的的角度进入,分享BLE协议栈。
ble交互过程
GAP层
- generic access profile(通用访问协议)
概念:
- Broadcaster,广播者
发出广播信号,可以没有无线接收器。- Observer,观察者
接收广播信号,可以没有无线发送器。
- Peripheral,外围设备
广播者,被动建立连接
既含有无线发送器,也含有无线接收器。- Central,中央设备
扫描/观察者,主动建立连接。
既含有无线发送器,也含有无线接收器。
- 主机
主动建立连接。- 从机
被动建立连接
广播包数据组成
广播包格式
- Preamable(前导):1字节,固定序列。
- 接入地址第一个bit为0:01010101
- 接入地址第一个bit为1:10101010
- Access Address(接入地址):
- 接入地址有两种类型:广播接入地址和数据接入地址。
- 广播接入地址:固定为 Ox8E89BED6, 在广播、扫描、发起连接时使用。
- 数据接入地址:随机值,不同的连接有不同的值。在连接建立之后的两个设
备间俠用。
- 接入地址有两种类型:广播接入地址和数据接入地址。
- PDU(协议数据单元)
- CRC(校验):24位crc校验
PDU
- 包括header,playload
header
- 4bit 广播报文类型
- 2bit 保留位
- 1bit 发送地址类型
- 1bit 接收地址类型
- 6bit playload长度
- 2bit 保留位
报文类型
BLE广播信道中的空中包分为有以下几种类型:
- 可连接非定向广播 (ADV_IND):所有收到该广播的设备,都可与之建立链路层连接。
- 可连接定向广播 (ADV_DIRECT_IND):指明了对方设备地址的,为之提供了连接功能的广播
- 不可连接广播 (ADV_NONCONN_IND):广播一些特定的信息,任何设备都可接收,但不可建立连接。
- 扫描请求 (SCAN_REQ):扫描者向指定的广播者发出的空中包,广播者收到扫描请求后,要立即回复扫描响应。
- 扫描响应 (SCAN_RSP):作为对扫描请求的响应,其中会携带一些与广播者相关的数据,并返回给扫描者。
- 连接请求 (CONNECT_REQ):如名。
- 可扫描通知 (ADV_SCAN_IND):作为对扫描请求的响应,其中会携带一些与广播者相关的数据,并返回给扫描者。不可连接。
注意:扫描分为主动扫描和被动扫描。
- 处于扫描态的设备可以接收广播信道的报文,通过扫描可以侦听哪些设备正在广播。