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值
相关推荐
jiang_bluetooth2 天前
GFPS扩展技术原理(八)-可听设备控制
蓝牙·gfps·fast pair·谷歌快速配对
jiang_bluetooth4 天前
GFPS扩展技术原理(七)-音频切换消息流
蓝牙·gfps·fast pair·谷歌快速连接
jiang_bluetooth20 天前
Bluetooth LE AUDIO架构概述
架构·蓝牙·ble audio·le audio
WPG大大通22 天前
芯驰X9SP与汽车麦克风-打造无缝驾驶体验
车载系统·汽车·硬件工程·蓝牙·开发板·麦克风
byte轻骑兵23 天前
【0x0019】HCI_Remote_Name_Request详解
蓝牙·通信协议·hci
byte轻骑兵25 天前
【0x0001】HCI_Set_Event_Mask详解
蓝牙·通信协议·hci
宋者为王1 个月前
【朝花夕拾】蓝牙&WiFi常识篇
蓝牙·p2p·热点·ap·wifi直连
AscendKing1 个月前
uniapp对接蓝牙
uni-app·蓝牙
再遇当年1 个月前
小米运动健康与华为运动健康在苹手机ios系统中无法识别蓝牙状态 (如何在ios系统中开启 蓝牙 相册 定位 通知 相机等功能权限,保你有用)
ios·蓝牙·智能手表·权限·苹果手机·小米手表·小米运动健康
SuperHeroWu71 个月前
【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 (三)
华为·蓝牙·harmonyos·鸿蒙·低功耗蓝牙·ble