目录
一、数据链路层概述
数据链路层(LL)是 BLE 协议中的关键一环,主要负责在物理无线信道上实现可靠、高效的点对点或广播数据传输。
BLE 物理层虽然负责无线信号的发送与接收,但仅靠物理层无法保证数据传输的正确性和高效性。
数据链路层承担了链路管理和数据流控制的任务,确保无线通信在复杂环境下稳定、低耗地运行。没有数据链路层,设备间的通信就像是没章法的广播,数据丢失多、功耗高、体验差。
该层主要职责:
1)帧的组装与解码
将上层数据封装成符合 BLE 格式的帧,并在接收时解析帧内容,包括处理校验(CRC)、帧头等,保证数据完整性。
2)连接的建立与维护
通过握手完成连接建立,分配连接参数,安排连接事件的时间和频率,维持两个设备间稳定的通信链路。
3)跳频机制实现
按照预定跳频序列,切换信道发送数据,避免无线干扰,提高链路质量和稳定性。
4)广播与扫描管理
控制设备何时广播广播包、扫描周围设备的广播包,实现设备发现和连接请求。
5) 功耗控制
通过精确的连接事件调度和休眠机制,最大限度减少设备功耗,支持低功耗物联网应用。
二、数据报文与传输机制
2.1 LL报文格式
BLE报文分为两种:广播报文和数据报文。其中在广播信道进行发送的报文叫做广播报文,在数据信道发送的报文叫数据报文。下图为LL报文的通用格式(适用于BLE协议版本 5.x以上):
注意:
1)广播信道和数据信道的具体介绍请参考:《【BLE系列-第一篇】BLE是怎么一步步统治低功耗通信的?》
2)LL的数据发送是小端模式。
2.2 LL通用内容介绍
广播报文和数据报文的区别主要在于PDU段,差异字段后续章节会单独介绍,下下面先介绍通用字段部分:
2.2.1 通用字段:前导符
前导符(Preamble)是 BLE 数据包的开头,用来给接收设备打招呼,相当于“准备好了吗,我要开始说话了”。它不是传数据的,而是为了:
- 让接收器启动工作(调频、对时)
- 让比特采样节奏对齐,避免听错
- 通常是一串 10101010(0xAA) 或 01010101(0x55),用于在硬件层面同步
前导符只在 PHY 层有意义,不进协议逻辑,主要给收发器芯片用。
2.2.2 通用字段:接入地址
接入地址(Access Address)是 BLE 每个数据包的标识字段,用于区分不同类型的包:
1)广播报文接入地址
广播接入地址包:固定使用 0x8E89BED6。广播用的这个固定地址 0x8E89BED6,看起来随意,实际上是 Bluetooth SIG 工程师从一堆候选中挑出来的“最不容易误判、最稳定”的一个:
- 比特分布好(不是全 0 或全 1)
- 自相关性低(不会跟自己搞混)
- 硬件容易快速锁定
- 实测抗干扰性强
工程角度讲,它不是“理论最优”,但它“够用而且好用”——是技术理性和工程拍板的折中产物。
2)数据报文接入地址
主设备在连接请求(CONNECT_IND)里会随机生成一个 32-bit 接入地址,用来唯一标识当前这条连接,连接一旦建立后:
- 后续所有数据包都用这个接入地址
- 在连接断开之前,这个值不会变
- 断开后重新连接会重新分配新的接入地址
这是 BLE 多连接设计的核心机制之一,用来防止不同连接串话。
2.2.3 通用字段:CRC
LL采用CRC-24算法,适用范围仅包括PDU,不包括前导符和接入地址。
2.2.4 公共地址和随机地址
1)公共地址(Public Address)
- 由厂商申请的 IEEE 注册地址(48 位 MAC)。
- 前 24 位为厂商 ID,后 24 位由厂商自定义。
- 唯一且不可变,全球唯一识别。
- 安全性一般,容易被跟踪。
3)随机地址(Random Address)
由设备动态生成,分三类:
①静态随机地址:
- 启动时生成,重启前不变。
- 可用于连接,格式固定(高两位为11)。
②可解析私有地址(RPA):
- 周期变换,使用 IRK 配对解析。
- 平衡隐私与身份识别。
③非解析私有地址(NRPA):
- 周期变换,不可解析。
- 最强隐私保护,无法识别身份。
3)比较总结
类型 | 唯一性 | 是否可变 | 是否可识别 | 应用场景 |
---|---|---|---|---|
公有地址 | 是 | 否 | 是 | 公共广播、常规通信 |
静态随机地址 | 否 | 重启后才会变化 | 是 | 通常连接场景 |
可解析私有地址 | 否 | 是 | 配对后可识别 | 隐私+身份识别 |
非解析私有地址 | 否 | 是 | 否 | 匿名广播 |
2.3 广播报文PDU介绍
下图为广播报文的格式图示
广播报文对以下字段做了特殊定义:
2.3.1 广播报文:Header
1)发送地址类型和接收地址类型
BLE 广播报文中的发送地址和接收地址类型,代表广播报文中Payload中的地址类型。发送地址和接收地址类型用于指定Payload中地址的类型(0:公共地址;1:随机地址)
发送地址和接收地址有效性如下:
报文类型 | TxAdd 表示谁 | RxAdd 表示谁 | 有效性说明 |
---|---|---|---|
通用广播指示(ADV_IND) | 广播者 | 无 | 需指定广播设备地址类型 |
定向连接指示(ADV_DIRECT_IND) | 广播者 | 扫描者 | 双方地址类型都需指定 |
不可连接指示(ADV_NONCONN_IND) | 广播者 | 无 | 需指定广播设备地址类型 |
主动扫描请求(SCAN_REQ) | 扫描者 | 广播者 | 双方地址类型都需指定 |
主动扫描响应(SCAN_RSP) | 广播者 | 无 | 需指定广播设备地址类型 |
主动连接请求(CONNECT_REQ) | 扫描者 | 广播者 | 双方地址类型都需指定 |
可扫描指示(ADV_SCAN_IND) | 广播者 | 无 | 需指定广播设备地址类型 |
2)报文类型
报文类型号 | 报文名 | 发送方 |
0 | 通用广播指示(ADV_IND) | 广播者 |
1 | 定向连接指示(ADV_DIRECT_IND) | 广播者 |
2 | 不可连接指示(ADV_NONCONN_IND) | 广播者 |
3 | 主动扫描请求(SCAN_REQ) | 扫描者 |
4 | 主动扫描响应(SCAN_RSP) | 广播者 |
5 | 主动连接请求(CONNECT_REQ) | 扫描者 |
6 | 可扫描指示(ADV_SCAN_IND) | 广播者 |
7~15 | 保留 | 保留 |
2.3.2 广播报文:Payload
2.3.2.1 广播报文类型说明
下表为七种广播报文的Payload字段示例,其中从广播者的地址和扫描者的地址都为6字节。
报文类型 | Payload说明 | 用途说明 |
---|---|---|
通用广播指示(ADV_IND) | 广播者地址 + 广播者数据(至多31字节 | - 应用场景: 用于设备主动广播其存在,支持扫描与连接。BLE 设备上电后常用此方式。 - 数据说明(地址外): 广播者数据:包含设备名、服务 UUID、制造商信息等,最长 31 字节。 |
定向连接指示(ADV_DIRECT_IND) | 广播者地址 + 扫描者地址 | - 应用场景: 用于快速连接已知主机(如配对过的主机)。主从设备需已知对方地址。 - 数据说明(地址外): 无其他数据,仅含目标主机地址。用于加快连接建立过程,减少广播干扰。 |
不可连接指示(ADV_NONCONN_IND) | 广播者地址 + 广播者数据(至多31字节 | - 应用场景: 用于仅广播信息、不接受连接或扫描。例如:温湿度传感器广播数据。 - 数据说明(地址外): 广播者数据:包含测量值、状态、位置等,最长 31 字节。 |
主动扫描请求(SCAN_REQ) | 扫描者地址 + 广播者地址 | - 应用场景: 主机主动请求广播设备发送额外信息(SCAN_RSP),配合扫描使用。 - 数据说明(地址外): 无附加数据,两个地址用于标识谁请求谁响应。 |
主动扫描响应(SCAN_RSP) | 广播者地址 + 广播者数据(至多31字节) | - 应用场景: 广播设备响应 SCAN_REQ,补充发送更多广播数据。 - 数据说明(地址外): 广播者数据:通常用于发送扩展信息(例如完整设备名),最长 31 字节。 |
主动连接请求(CONNECT_REQ) | 发起者地址 + 广播者地址 + 发起者数据(至多22字节) | - 应用场景: 主机发起连接请求,包含连接参数配置,建立 BLE 链路连接。 - 数据说明(地址外): |
可扫描指示(ADV_SCAN_IND) | 广播者地址 + 广播者数据(至多31字节) | - 应用场景: 允许设备被扫描,但不允许连接。通常用于展示信息后被查询更多内容。 - 数据说明(地址外): 广播者数据:设备初步信息或标识符,最长 31 字节。 |
2.3.2.2 主动连接请求(CONNECT_REQ)
字段名 | 字段大小 | 字段说明 |
Access Address | 4字节 | 链路层连接访问地址:连接建立后,数据信道所有包的标识符(类似TCP连接的端口号) |
CRCinit | 3字节 | 数据信道包的CRC校验初始值,主设备随机生成 |
Winsize | 1字节 | TransmitWindowSize = WinSize * 1.25 ms(主设备发送首个数据包的时间窗口) |
WinOffset | 2字节 | TransmitWindowOffset = WinOffset*1.25ms (从广播结束到首个连接事件的延迟) |
Interval | 2字节 | ConnInterval = Interval *1.25ms(主设备发送心跳包的间隔) |
Latency | 2字节 | 从机必须回复主机之前最多可以连续忽略多少次主机的连接事件 |
Timeout | 2字节 | 规定多长时间没通信连接会断开,Timeout >(1+Latency)*(ConnInterval) |
ChM | 5字节 | 哪些信道可以使用(信道映射,标记37个数据信道的可用性,每bit代表1个信道) |
Hop | 5bit | 跳频增量(范围5-16),用于计算下一个信道:next_ch = (curr_ch + Hop) % 37。 |
SCA | 3bit(和Hop公用一个字节) | 主设备时钟精度信息(主设备睡眠时钟精度(0=250ppm,7=500ppm),影响从设备的时序容差) |
2.1.3.3 附录:广播报文图示
2.4 数据报文PDU介绍
2.4.1 数据报文:Header
1)LLID
0x01:数据包,连续包或者空包
0x02:数据包,起始包或者单包完整包
0x03:控制包
2)MESN
下一个期望的对端包的SN
3)SN
当前包的SN
4)MD
more data,代表是否有更多数据,即是否分包
2.4.2 数据报文:Payload
1)L2CAP Channel ID
在 BLE 的 L2CAP 层中,Channel ID(CID)是 2 字节字段,常见值:
- 0x0004:ATT(用于 GATT 数据)
- 0x0006:SMP(配对)
- 0x0005:LE Signaling(连接参数更新)
- 0x0040 及以上:动态分配的 Channel,用于 LE Credit-Based 传输(如 ISOchronous Channels
2)Info
数据格式由Channel ID来决定
3)MIC
message integrity check,信息完整性校验,涉及到加密操作,不一定需要此项
想了解更多嵌入式技术知识,请点击阅读我的其他文章
如果你觉得内容对您有帮助,别忘了点赞、收藏和分享支持下哦!