【BLE系列-第二篇】数据链路层(LL):基于1M PHY模式的报文详解

目录

一、数据链路层概述

二、数据报文与传输机制

2.1 LL报文格式

2.2 LL通用内容介绍

2.2.1 通用字段:前导符

2.2.2 通用字段:接入地址

2.2.3 通用字段:CRC

2.2.4 公共地址和随机地址

2.3 广播报文PDU介绍

2.3.1 广播报文:Header

2.3.2 广播报文:Payload

2.3.2.1 广播报文类型说明

2.3.2.2 主动连接请求(CONNECT_REQ)

2.1.3.3 附录:广播报文图示

2.4 数据报文PDU介绍

2.4.1 数据报文:Header

2.4.2 数据报文:Payload


一、数据链路层概述

数据链路层(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 链路连接。

- 数据说明(地址外):

2.1.3.2.2 主动连接请求(CONNECT_REQ)

可扫描指示(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,信息完整性校验,涉及到加密操作,不一定需要此项


想了解更多嵌入式技术知识,请点击阅读我的其他文章

烟花的文章链接集合-CSDN博客

如果你觉得内容对您有帮助,别忘了点赞、收藏和分享支持下哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值