BLE蓝牙链路层数据包结构

0x00 前提

BLE5.0物理层设计2Mpbs的码元率,实际我们的数据传输速率远远到不了这个级别,主要原因就是我们没有办法直接单次发送1M或者1K数据,必须按照我们知道的ATT_MTU作为最大值进行拆包发送,不断拆包的过程中导致整体蓝牙有效数据吞吐量下降。


0x01 BLE PHY 包格式

BLE PHY 包格式由以下组成,排除 前导码、访问地址、CRC地址 对于BLE4.0/BLE4.1 上层协议(LL)最大可以包含39字节长度的PDU(协议数据单元)。

注意: 39字节是广告数据包达到的最大 LL PDU 大小(2字节头,6字节设备地址,31字节 AD)。对于数据包,最大 PDU 大小为33字节(2 Header + 4 L2CAP + 23 ATT + 4 MIC)。


但是更新后的BLE4.2/BLE5.0 直接升级硬件,将这一长度扩展到257。但是默认了兼容BLE4.0/4.1还是采用了上面的39设计。

注意: PHY 的数据包最大长度直接由硬件决定,也是限制我们BLE 数据包大小的根本原因。


拓展:

preamble(前导帧)为1个字节,根据Access Address第一个Bit,有两种取值情况:0x55或者0xAA

  • 0b010101010
  • 0b101010101

Access Address用来标示接收者ID或者空中包身份,BLE只有一种packet格式,根据Access Address的不同,又区分两种Packet类型:广播包和数据包:

  1. 广播包Access Address 固定为0x8E89BED6,广播包只能在广播信道(channel)上传输,即只能在37/38/39信道上传输(注:从蓝牙5.0开始广播包可以在其它信道上传输)。广播包发送给附近所有的observer(扫描者)。
  2. 数据包Access Address为一个32bit的随机值,由Initiator生成。数据包,其实是数据信道上的空中包的简称,数据包只在数据信道上传输,即除37/38/39之外的其余37信道(BLE总共占用40个信道)。每建立一次连接,重新生成一次Access address。数据包是给连接通信使用的,即用于master和slave之间通信的。
  3. 蓝牙数据包又分空包(empty packet)和普通数据包(data packet)两种.空包整个payload为空,故名空包。

逻辑链路层再往上就是L2CAP------逻辑链路控制适配协议,如下的Basic L2CAP Header+Information Payload组成我们这里的基本帧(B-frame)。

L2CAP协议再上就是我们操作特征值的ATT层,这一层数据长度被 最大传输单元 ATT_MTU限制,ATT_Payload = Attribute OPCode + Attribute Parames + Authentication Signature(可选)组成。排除12字节可选的认证签名,和一个字节属性操作码。

对于我们这里的写属性值,其 Attribute Parameters = 其 Attribute Handle(2) + Attribute Value, Attribute Value 就是我们操作属性的值,其最大长度 = ATT_MTU - Attribute OPCode(1) - Attribute Handle(2) = ATT_MTU - 3。

对于读操作属性,主要包含在 ReadResponse 操作码。最大长度 = ATT_MTU - Attribute OPCode(1) = ATT_MTU - 1。

以上,读写属性值最大有效数据长度直接由ATT_MTU决定,但是根本收LL PDU 大小限制。


0x02 LE Data Length Extension

BLE4.2/5.0 新增功能 DLE 数据长度扩展(LE Data Length Extension)功能允许LE控制器在连接状态下发送具有高达251字节的PDU。在连接期间的任何时刻,主从设备可以协商该PDU大小。

对比与BLE4.0/4.1的控制器数据通道最大有效载荷为27字节。使能数据扩展功能后的BLE4.2/BLE5.0能够达到251,数据速率提高了大约2.5倍。

  1. 如果PDU大小和传输时间都被设置为默认值(即TX和RX都为27B,328us),则LL_LENGTH_REQ不发送。如果对等连接的主从设备发送LL_LENGTH_REQ,此时对等设备同样以默认大小LL_LENGTH_RSP回应。
  2. 如果PDU的大小收发双方或者有一方不是默认值,则设备的LE控制器将使用LL_LENGTH_REQ和LL_LENGTH_RSP控制PDU协商一个PDU的较大的有效负载大小。

0x03 小结

  • BT4.2之后,Payload length 8 bits全部用来表示长度,这样的话,payload size最大可达251字节(255 -- MIC size)。
  • BLE连接建立之后,可以动态更改data length长度(默认为27字节),这个特性叫做Data Length Extension(DLE),DLE是通过Link layer命令:LL_LENGTH_REQ和LL_LENGTH_RSP来实现的。
  • Data length直接跟蓝牙芯片的射频能力有关,如果PHY层已经做死了,无法扩展。
  • L2CAP length,2字节长度,表示后面information payload的长度,information payload最大长度除了受这个L2CAP length字段约束,同时还受MTU的限制。
  • MTU,Maximum Transmission Unit,是ATT层与L2CAP层可以交互的最大数据长度,或者说是Client与Server可以交互的最大长度。MTU size则可以通过后面要讲到的Exchange MTU Request和Exchange MTU Response来改变,而L2CAP length无法动态改变,也就是说不能超过65535。

0x04 示例数据包

AAAB5D65501E08040004001B130053D550F6

  • AA -- 前导帧(preamble)
  • 0x50655DAB -- 访问地址(access address)
  • 1E -- LL帧头字段(LL header)
  • 08 -- 有效数据包长度(payload length)
  • 04000400 -- ATT数据长度,以及L2CAP通道编号
  • 1B -- notify command
  • 0x0013 -- 应用数据handle
  • 0x53 -- 真正要发送的应用数据
  • 0xF650D5 -- CRC24值
相关推荐
Darkershadow4 天前
蓝牙学习之Time Set
python·学习·蓝牙·ble·mesh
榕树子4 天前
【蓝牙】安全密钥如何生成:蓝牙Mesh网络的安全基石
安全·蓝牙
Ar呐6 天前
软考网规篇之无线通信网——无线个域网蓝牙和Zigbee、移动通信和5G
5g·蓝牙·zigbee·高级软考·网络规划设计师
CCTI_Curran9 天前
迷你标签打印机做TELEC认证注意事项
运维·服务器·wifi·蓝牙·telec认证·日本认证·无线产品
byte轻骑兵9 天前
HFP协议核心AT指令速查表
信息与通信·蓝牙·通信·hfp·通话
summerkissyou198710 天前
Android13-蓝牙-常见问题
android·蓝牙
Industio_触觉智能11 天前
触觉智能RK3576开发板OpenHarmony开源鸿蒙蓝牙BLE主机实现方案
蓝牙·openharmony·主机·ble·开源鸿蒙·rk3576·从机
summerkissyou198713 天前
Android13-蓝牙-发现,配对,连接-例子
android·蓝牙
wotaifuzao15 天前
(九)一文吃透 BLE:从低功耗原理到协议栈与实战概念
物联网·硬件架构·蓝牙·低功耗·ble·设计原理
byte轻骑兵15 天前
【LE Audio】BAP协议精讲[1]: 开启低功耗音频新纪元
人工智能·音视频·蓝牙·le audio·bap